因此,我一直在尝试从Invoke-Command错误中获取完整的错误消息和堆栈跟踪,并且没有任何运气。
我运行了这段代码:
Invoke-command -COMPUTER "TESTCOMPUTER" -ScriptBlock {
klist purge -li 0x3e7
Return Get-Service
} -ErrorVariable errmsg
Write-Host "`r`nError: $errmsg"
这是我在控制台中收到的输出:
[TESTCOMPUTER]连接到远程服务器TESTCOMPUTER失败,并显示以下错误消息:WinRM无法完成操作。
验证指定的计算机名称有效,可通过网络访问该计算机以及该计算机的防火墙异常(exception)
WinRM服务已启用,并允许从此计算机进行访问。默认情况下,公共(public)配置文件的WinRM防火墙异常(exception)将访问权限限制为
同一本地子网中的远程计算机。有关更多信息,请参见about_Remote_Troubleshooting帮助主题。
+ CategoryInfo:OpenError:(TESTCOMPUTER)[],PSRemotingTransportException
+ FullyQualifiedErrorId:WinRMOperationTimeout,PSSessionStateBroken
错误:[TESTCOMPUTER]连接到远程服务器TESTCOMPUTER失败,并显示以下错误消息:WinRM无法完成操作。
验证指定的计算机名称有效,可通过网络访问该计算机以及WinR的防火墙异常(exception)
M服务已启用,并允许从此计算机进行访问。默认情况下,公共(public)配置文件的WinRM防火墙异常(exception)将限制对远程访问
同一本地子网中的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
它将返回整个错误(错误颜色,即红色)
您可以通过组合
$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
可能还要添加更多感兴趣的属性,但这取决于您。
关于powershell - Powershell调用注释-ErrorVariable输出不完整,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54153148/