因此,我一直在尝试从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/

10-11 23:09