Powershell Invoke-Command -ErrorVariable 输出不完整
Powershell Invoke-Command -ErrorVariable output is incomplete
所以我一直在尝试从 Invoke-Command 错误中获取完整的错误消息和堆栈跟踪,但没有任何运气。
我运行这个代码:
Invoke-command -COMPUTER "TESTCOMPUTER" -ScriptBlock {
klist purge -li 0x3e7
Return Get-Service
} -ErrorVariable errmsg
Write-Host "`r`nError: $errmsg"
这是我在控制台中收到的输出:
[TESTCOMPUTER] 连接到远程服务器 TESTCOMPUTER 失败,出现以下错误消息:WinRM 无法完成操作。
验证指定的计算机名称是否有效、计算机是否可以通过网络访问以及防火墙例外
WinRM 服务已启用并允许从此计算机进行访问。默认情况下,public 配置文件的 WinRM 防火墙例外限制访问
同一本地子网中的远程计算机。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。
+ CategoryInfo:OpenError:(TESTCOMPUTER)[],PSRemotingT运行sportException
+ FullyQualifiedErrorId:WinRMOperationTimeout,PSSessionStateBroken
错误:[TESTCOMPUTER] 连接到远程服务器 TESTCOMPUTER 失败,出现以下错误消息:WinRM 无法完成操作。
验证指定的计算机名称是否有效、计算机是否可通过网络访问以及 WinR 的防火墙例外
M 服务已启用并允许从此计算机进行访问。默认情况下,public 配置文件的 WinRM 防火墙例外限制对远程访问
e 同一本地子网内的计算机。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。
如您所见,第二部分是缺少堆栈跟踪的错误副本。我怎样才能把整个错误变成一个字符串?
ErrorVariable 是一个 System.Management.Automation.ErrorRecord
。
如果你对这个变量做 Get-Member
,你可以看到它有这些方法和属性:
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetObjectData Method void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context), void ISeri...
GetType Method type GetType()
ToString Method string ToString()
writeErrorStream NoteProperty bool writeErrorStream=True
CategoryInfo Property System.Management.Automation.ErrorCategoryInfo CategoryInfo {get;}
ErrorDetails Property System.Management.Automation.ErrorDetails ErrorDetails {get;set;}
Exception Property System.Exception Exception {get;}
FullyQualifiedErrorId Property string FullyQualifiedErrorId {get;}
InvocationInfo Property System.Management.Automation.InvocationInfo InvocationInfo {get;}
PipelineIterationInfo Property System.Collections.ObjectModel.ReadOnlyCollection[int] PipelineIterationInfo {get;}
ScriptStackTrace Property string ScriptStackTrace {get;}
TargetObject Property System.Object TargetObject {get;}
PSMessageDetails ScriptProperty System.Object PSMessageDetails {get=& { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails };}
如果您省略 Write-Host
并以
结束您的代码
$errmsg
它将return整个错误(错误颜色即红色)
您可以通过组合 $errmsg
对象的不同属性来构造完整的错误消息,如下所示:
$err = "`r`nError: {0}`r`n + CategoryInfo : {1}`r`n + FullyQualifiedErrorId : {2}" -f $errmsg.ErrorDetails, $errmsg.CategoryInfo, $errmsg.FullyQualifiedErrorId
Write-Host $err
或者使用 Here-String 以获得更好的可读性:
$err = @"
Error: $($errmsg.ErrorDetails)
+ CategoryInfo : $($errmsg.CategoryInfo)
+ FullyQualifiedErrorId : $($errmsg.FullyQualifiedErrorId)
"@
Write-Host $err
甚至可能还有更多感兴趣的属性可以添加到其中,但这取决于您。
所以我一直在尝试从 Invoke-Command 错误中获取完整的错误消息和堆栈跟踪,但没有任何运气。
我运行这个代码:
Invoke-command -COMPUTER "TESTCOMPUTER" -ScriptBlock {
klist purge -li 0x3e7
Return Get-Service
} -ErrorVariable errmsg
Write-Host "`r`nError: $errmsg"
这是我在控制台中收到的输出:
[TESTCOMPUTER] 连接到远程服务器 TESTCOMPUTER 失败,出现以下错误消息:WinRM 无法完成操作。 验证指定的计算机名称是否有效、计算机是否可以通过网络访问以及防火墙例外 WinRM 服务已启用并允许从此计算机进行访问。默认情况下,public 配置文件的 WinRM 防火墙例外限制访问 同一本地子网中的远程计算机。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。 + CategoryInfo:OpenError:(TESTCOMPUTER)[],PSRemotingT运行sportException + FullyQualifiedErrorId:WinRMOperationTimeout,PSSessionStateBroken
错误:[TESTCOMPUTER] 连接到远程服务器 TESTCOMPUTER 失败,出现以下错误消息:WinRM 无法完成操作。 验证指定的计算机名称是否有效、计算机是否可通过网络访问以及 WinR 的防火墙例外 M 服务已启用并允许从此计算机进行访问。默认情况下,public 配置文件的 WinRM 防火墙例外限制对远程访问 e 同一本地子网内的计算机。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。
如您所见,第二部分是缺少堆栈跟踪的错误副本。我怎样才能把整个错误变成一个字符串?
ErrorVariable 是一个 System.Management.Automation.ErrorRecord
。
如果你对这个变量做 Get-Member
,你可以看到它有这些方法和属性:
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetObjectData Method void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context), void ISeri...
GetType Method type GetType()
ToString Method string ToString()
writeErrorStream NoteProperty bool writeErrorStream=True
CategoryInfo Property System.Management.Automation.ErrorCategoryInfo CategoryInfo {get;}
ErrorDetails Property System.Management.Automation.ErrorDetails ErrorDetails {get;set;}
Exception Property System.Exception Exception {get;}
FullyQualifiedErrorId Property string FullyQualifiedErrorId {get;}
InvocationInfo Property System.Management.Automation.InvocationInfo InvocationInfo {get;}
PipelineIterationInfo Property System.Collections.ObjectModel.ReadOnlyCollection[int] PipelineIterationInfo {get;}
ScriptStackTrace Property string ScriptStackTrace {get;}
TargetObject Property System.Object TargetObject {get;}
PSMessageDetails ScriptProperty System.Object PSMessageDetails {get=& { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails };}
如果您省略 Write-Host
并以
$errmsg
它将return整个错误(错误颜色即红色)
您可以通过组合 $errmsg
对象的不同属性来构造完整的错误消息,如下所示:
$err = "`r`nError: {0}`r`n + CategoryInfo : {1}`r`n + FullyQualifiedErrorId : {2}" -f $errmsg.ErrorDetails, $errmsg.CategoryInfo, $errmsg.FullyQualifiedErrorId
Write-Host $err
或者使用 Here-String 以获得更好的可读性:
$err = @"
Error: $($errmsg.ErrorDetails)
+ CategoryInfo : $($errmsg.CategoryInfo)
+ FullyQualifiedErrorId : $($errmsg.FullyQualifiedErrorId)
"@
Write-Host $err
甚至可能还有更多感兴趣的属性可以添加到其中,但这取决于您。