我现在正在寻找解决方案或帮助我理解原因的东西两天。
对于某些操作,我想将任何错误发送到“-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)
有什么想法如何在电子邮件中仅获取人类可读的错误消息吗?
谢谢你!此致!
长话短说:博士:
要仅获取与使用公共参数收集的 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) 中的对象 - 即使只收集一个错误。
-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)
| 归档时间: |
|
| 查看次数: |
3125 次 |
| 最近记录: |