代码之家  ›  专栏  ›  技术社区  ›  David Bentley

powershell调用注释-errorvariable输出不完整

  •  0
  • David Bentley  · 技术社区  · 6 年前

    因此,我一直试图从invoke命令错误中获取完整的错误消息和堆栈跟踪,但一直没有成功。

    我运行了以下代码:

    Invoke-command -COMPUTER "TESTCOMPUTER" -ScriptBlock {
    
        klist purge -li 0x3e7
    
        Return Get-Service
    
    } -ErrorVariable errmsg
    
    Write-Host "`r`nError: $errmsg"
    

    这是我在控制台收到的输出:

    [TestComputer]连接到远程服务器TestComputer失败,错误消息如下:WinRM无法完成操作。 验证指定的计算机名是否有效,计算机是否可以通过网络访问,以及 WinRM服务已启用,并允许从此计算机进行访问。默认情况下,公共配置文件的winrm防火墙例外限制对 同一本地子网中的远程计算机。有关详细信息,请参阅关于远程故障排除帮助主题。 +类别信息:openerror:(testcomputer)[],psremotingtransportexception +fullyQualifiederRorID:winrmOperationTimeout,psSessionStateBroken

    错误:[testcomputer]连接到远程服务器testcomputer失败,错误消息如下:winrm无法完成操作。 验证指定的计算机名是否有效,计算机是否可以通过网络访问,以及winr的防火墙例外 M服务已启用并允许从此计算机进行访问。默认情况下,公共配置文件的winrm防火墙例外限制对remot的访问 同一本地子网中的计算机。有关详细信息,请参阅关于远程故障排除帮助主题。

    如您所见,第二部分是缺少堆栈跟踪的错误的副本。我怎样才能把整个错误串成一个字符串?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Theo    6 年前

    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字符串以提高可读性:

    $err = @"
    Error: $($errmsg.ErrorDetails)
        + CategoryInfo          : $($errmsg.CategoryInfo)
        + FullyQualifiedErrorId : $($errmsg.FullyQualifiedErrorId)
    "@ 
    Write-Host $err
    

    可能会有更多感兴趣的属性添加到其中,但这取决于您。