错误变量输出

Ses*_*ssl 1 powershell

我现在正在寻找解决方案或帮助我理解原因的东西两天。

对于某些操作,我想将任何错误发送到“-ErrorVariable create_error”。没问题。之后,我只想要错误消息的例外:

$create_error = $create_error.Exception
Run Code Online (Sandbox Code Playgroud)

变量的输出现在是:

$create_error
Access to the path '2021' is denied.
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用此变量作为电子邮件的正文,我会收到以下电子邮件文本:

    System.UnauthorizedAccessException: Access to the path '2021' is denied. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost) 
    at System.IO.DirectoryInfo.CreateSubdirectoryHelper(String path, Object directorySecurity) 
    at System.IO.DirectoryInfo.CreateSubdirectory(String path) 
    at Microsoft.PowerShell.Commands.FileSystemProvider.CreateDirectory(String path, Boolean streamOutput)
Run Code Online (Sandbox Code Playgroud)

发送邮件:

Send-MailMessage -To $to -From $from -Subject $subject -Body $create_error
Run Code Online (Sandbox Code Playgroud)

有什么想法如何在电子邮件中仅获取人类可读的错误消息吗?

谢谢你!此致!

mkl*_*nt0 8

长话短说:博士

要仅获取与使用公共参数收集的 PowerShell 错误记录关联的错误消息-ErrorVariable

$create_error.ForEach('ToString') # Call .ToString() on all records
Run Code Online (Sandbox Code Playgroud)

注意:如果您的变量仅包含单个错误记录(未包装在集合中),则只需调用.ToString(),例如在访问会话范围自动$Error集合中的单个错误时:

Get-Item NoSuch -ErrorAction SilentlyContinue # provoke an error
# Access the most recent error individually:
$Error[0].ToString() # -> 'Cannot find path '...\NoSuch' because it does not exist.'
Run Code Online (Sandbox Code Playgroud)

背景资料:

公共参数将执行给定命令期间发生的非终止-ErrorVariable错误收集System.Management.Automation.ErrorRecord类似数组的集合 ( System.Collections.ArrayList) 中的对象 - 即使只收集一个错误。

  • 注意:相比之下, 终止错误(cmdlet 很少发出这种错误)会中止整个命令-ErrorVariable,因此使用常见参数(例如和 )收集命令自己的流输出的请求-OutVariable不会得到满足。要处理此类错误,您需要一个try……catch声明finally。请参阅此答案了解详细信息,并查看此 GitHub 文档问题以全面概述 PowerShell 极其复杂的错误处理。

这些错误记录通过补充额外的 PowerShell 相关元数据(例如脚本文件 ( *.ps1) 中的错误位置)来封装 .NET 异常。

有两个单独的字段可能包含最能描述当前错误特征的消息(字符串):

  • .Exception.Message

  • 可选,.ErrorDetails.Message可用于覆盖.Exception.Message控制台中错误的默认显示格式。

.ToString()方法包装了此逻辑,因此它是获取错误消息的最简单方法。


示例代码

注意:通常,.ErrorDetails$null。设置它需要在构造错误记录时执行额外的步骤。
下面是 PowerShell 中的一个示例(但请注意,在编译的 cmdlet 中构造错误记录更为常见):

# Create an error record.
$err = [System.Management.Automation.ErrorRecord]::new(
  [InvalidOperationException]::new('foo'),  # the exception being wrapped
  'errId',             # error ID
  'InvalidOperation',  # category 
  $null                # the target object
)
# Then assign an ErrorDetails instance with a custom message.
$err.ErrorDetails = [System.Management.Automation.ErrorDetails] 'bar'
Run Code Online (Sandbox Code Playgroud)

现在,$err.Exception.Message报告'foo', 和$err.ErrorDetails.Message 'bar'。当您调用 时.ToString(),该.ErrorDetails.Message值优先;如果.ErrorDetails$null'foo'将报告:

PS> $err.ToString()
bar
Run Code Online (Sandbox Code Playgroud)