如何在远程计算机上的 Invoke-Command 引发的异常中保留 ScriptStackTrace?

2023-12-27

我正在编写一个 Powershell 脚本,它执行构建/部署过程中的步骤之一,并且需要在远程计算机上运行一些操作。该脚本相对复杂,因此如果在远程活动期间发生错误,我需要详细的堆栈跟踪来了解脚本中发生错误的位置(在已生成的日志记录之上)。

出现问题的原因是,当从远程计算机中继终止异常时,Invoke-Command 会丢失堆栈跟踪信息。如果在本地计算机上调用脚本块:

Invoke-Command -ScriptBlock {
    throw "Test Error";
}

返回所需的异常详细信息:

Test Error
At C:\ScriptTest\Test2.ps1:4 char:2
+     throw "Test Error";
+     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (Test Error:String) [], RuntimeException
    + FullyQualifiedErrorId : Test Error

但如果远程运行:

Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
    throw "Test Error";
}

异常堆栈跟踪指向整个 Invoke-Command 块:

Test Error
At C:\ScriptTest\Test2.ps1:3 char:1
+ Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (Test Error:String) [], RuntimeException
    + FullyQualifiedErrorId : Test Error

我可以手动将异常传输回本地计算机:

$exception = Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
    try
    {
        throw "Test Error";
    }
    catch
    {
        return $_;
    }
}

throw $exception;

但重新抛出它会丢失堆栈跟踪:

Test Error
At C:\ScriptTest\Test2.ps1:14 char:1
+ throw $exception;
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (Test Error:PSObject) [], RuntimeException
    + FullyQualifiedErrorId : Test Error

如果我将异常写入输出:

$exception = Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
    try
    {
        throw "Test Error";
    }
    catch
    {
        return $_;
    }
}

Write-Output $exception;

我得到了正确的堆栈跟踪信息:

Test Error
At line:4 char:3
+         throw "Test Error";
+         ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (Test Error:String) [], RuntimeException
    + FullyQualifiedErrorId : Test Error

但由于它不在错误流中,因此我的构建工具无法正确拾取它。如果我尝试 Write-Error,我会遇到类似的问题,重新抛出异常,并且堆栈跟踪指向脚本的错误部分。

所以我的问题是 - 如何让 Powershell 报告来自远程计算机的异常,就好像它是在本地引发的一样,具有相同的堆栈跟踪信息和错误流?


当您运行某些代码并且失败时,您会收到一个ErrorRecord反映了代码you(本地计算机)执行。所以当你使用throw "error"您可以访问该代码的调用信息和异常。

当你使用Invoke-Command,你没有执行throw "error"不再是远程计算机了。您(本地计算机)正在执行Invoke-Command ....,这就是为什么ErrorRecord你得到的反映了这一点(而不是你想要的真正的例外)。这是必须的方式,因为异常可能来自远程计算机执行的脚本块,但也可能来自Invoke-Command本身,因为它无法连接到远程计算机或类似的东西。

当异常最初是在远程计算机上引发时,Invoke-Command/PowerShell 抛出一个远程异常 https://msdn.microsoft.com/en-us/library/system.management.automation.remoteexception(v=vs.85).aspx在本地计算机上。

#Generate errors
try { Invoke-Command -ComputerName localhost -ScriptBlock { throw "error" } }
catch { $remoteexception = $_ }

try { throw "error" }
catch { $localexception = $_ }

#Get exeception-types
$localexception.Exception.GetType().Name
RuntimeException

$remoteexception.Exception.GetType().Name
RemoteException

这个异常类型有一些额外的属性,包括SerializedRemoteException and SerializedRemoteInvocationInfo其中包含远程会话中引发的异常的信息。使用这些,您可以接收“内部”异常。

  • 序列化远程异常 https://msdn.microsoft.com/en-us/library/system.management.automation.remoteexception.serializedremoteexception(v=vs.85).aspx:获取 Windows PowerShell 远程实例引发的原始异常。
  • 序列化远程调用信息 https://msdn.microsoft.com/en-us/library/system.management.automation.remoteexception.serializedremoteinvocationinfo(v=vs.85).aspx:获取Windows PowerShell 远程实例的调用信息。

Sample:

#Show command that threw error 
$localexception.InvocationInfo.PositionMessage

At line:4 char:7
+ try { throw "error" }
+       ~~~~~~~~~~~~~

$remoteexception.Exception.SerializedRemoteInvocationInfo.PositionMessage    

At line:1 char:2
+  throw "error"
+  ~~~~~~~~~~~~~

然后,您可以编写一个简单的函数来动态提取信息,例如:

function getExceptionInvocationInfo ($ex) {
    if($ex.Exception -is [System.Management.Automation.RemoteException]) {
        $ex.Exception.SerializedRemoteInvocationInfo.PositionMessage
    } else {
        $ex.InvocationInfo.PositionMessage
    }
}

function getException ($ex) {
    if($ex.Exception -is [System.Management.Automation.RemoteException]) {
        $ex.Exception.SerializedRemoteException
    } else {
        $ex.Exception
    }
}

getExceptionInvocationInfo $localexception

At line:4 char:7
+ try { throw "error" }
+       ~~~~~~~~~~~~~

getExceptionInvocationInfo $remoteexception
At line:1 char:2
+  throw "error"
+  ~~~~~~~~~~~~~

请注意,SerializedRemoteExpcetion显示为PSObject由于网络传输期间的序列化/反序列化,因此如果您要检查异常类型,则需要从中提取它psobject.TypeNames.

$localexception.Exception.GetType().FullName
System.Management.Automation.ItemNotFoundException

$remoteexception.Exception.SerializedRemoteException.GetType().FullName
System.Management.Automation.PSObject

#Get TypeName from psobject
$remoteexception.Exception.SerializedRemoteException.psobject.TypeNames[0]
Deserialized.System.Management.Automation.ItemNotFoundException
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在远程计算机上的 Invoke-Command 引发的异常中保留 ScriptStackTrace? 的相关文章

  • 将带有星号的注册表项传递给测试路径

    我想通过以下方式运行此注册表路径Test Path在 PowerShell 中 但它包含一个星号 该星号在注册表中有效 但在 Windows 路径中无效 问题是 当我通过它时 Test Path将星号视为通配符 因此这需要非常非常长的时间
  • powershell Invoke-WebRequest WebSession 不起作用

    我无法让以下代码工作 它似乎已登录 但随后返回带有 response 的登录页面 我猜这与回发有关 有办法解决这个问题吗 谢谢 login Invoke WebRequest Uri http www sqlpass org UserLog
  • Convertfrom-string 删除前导零

    我在使用 Convertfrom String cmdlet 时遇到问题 value something 009 value ConvertFrom String Delimiter Output P1 P2 something 9 我想要
  • 如何将哈希表添加到多维数组?无法通过成员访问枚举分配值

    我在将哈希表添加到多维数组时遇到问题 我编码如下 Data BIBs BIB BIBName BIBName Standort Standort B cher BuchName BuchName Autor Autor 此代码正在运行并创建
  • 使用powershell获取快捷方式(.lnk)文件的目标

    我有一堆 lnk 文件 需要根据快捷方式指向的目标对它们进行不同的处理 我发现很少有关于如何使用其他语言执行此操作的信息 但没有找到有关使用 powershell 执行此操作的信息 我试过这个 sh New Object COM WScri
  • 具有特殊AssignableScopes的Azure自定义RM角色定义

    我正在尝试创建一个自定义 Azure RM 角色定义 其范围适用于一个订阅内的某些资源组 我不想提供对所有订阅或仅一个资源组的访问权限 并且我无法指定资源组列表 因为其中一些资源组尚未创建 我只想提供订阅资源组的某些子集的访问权限 为此 我
  • PowerShell从csv中提取特定列并将其存储在变量中

    我的keys csv文件看起来像这样 PrjKey BldKey key LS LOOKUPSNAP1 LS LOOKUPSNAP1 LS LSUH3 LS LSUH3 LSPERF LPMDS0 LSPERF LPMDS0 LSPERF
  • Powershell删除文件夹-force

    我似乎无法删除文件 文件夹 除非我必须为所有文件 文件夹输入 A 我缺少什么 Get Childitem C Users AppData Local Temp ErrorAction SilentlyContinue Where Creat
  • 如何在 PowerShell 中处理命令行参数

    处理命令行参数的 最佳 方法是什么 似乎有几个关于 最佳 方法是什么的答案 因此我陷入了如何处理像这样简单的事情上 script ps1 n name d domain AND script ps1 d domain n name 有没有一
  • 使用powershell计算子文件夹中具有特定名称的文件数量

    因此 我开始解决一个问题 我需要知道某个名称的子文件夹中有多少个文件 这些文件在整个目录中重复多次 我想要计算的所有文件夹都具有相同的名称 例如 Main Folder Subfolder Folder I want to count Fo
  • Powershell,从txt文件读取并格式化数据(删除行,删除之间的空格)

    我对 powershell 真的很陌生 我想使用powershell读取txt文件并将其更改为其他格式 从 txt 文件中读取 设置数据格式 删除行 删除之间的空格 记录计数 T 000000002 9 个字符 然后将输出写入新文件 我两天
  • Invoke-WebRequest SSL 失败?

    当我尝试使用时Invoke WebRequest我收到一些奇怪的错误 Invoke WebRequest Uri https idp safenames com Invoke WebRequest The underlying connec
  • 在 PowerShell 中,如何组合具有一对一关系的两个命令的结果?

    此特定示例是 Get User 和 Get Mailbox Exchange 2010 Get User 返回一些我需要的列 Get Mailbox 返回一些其他列 我很难弄清楚如何将两者的结果合并到一个表中 并包含两者的结果 Get Us
  • 使用 shell_exec 将 PHP 转换为 Powershell

    如果我运行 output shell exec powershell get service dhcp 我得到了 dhcp 服务的完美输出 显示正在运行 但如果我运行 output shell exec powershell get use
  • 将服务器添加到 SQL Management Studio

    我想将不同服务器上的一堆 SQL 2000 2005 的混合 服务器实例添加到我的 SSMS SQL Managment Studio 注册服务器 我正在遵循本教程here http sev17 com 2008 12 registerin
  • 使用 PowerShell 修改 Visual Studio 解决方案和项目文件

    我们目前正在重新组织源代码 将内容移动到新目录中 结构 这会影响我们的 Visual Studio 解决方案和项目文件 其中诸如程序集引用 可能的输出目录 构建前和构建后事件等 必须更新以反映我们的更改 由于我们有许多解决方案和项目 我希望
  • 防止集成终端自动打开

    每当我在 VS Code 中打开 PowerShell 脚本时 集成终端就会打开 如何防止集成终端自动打开 我搜索了 终端 的设置 但没有发现与自动启动相关的内容 VSCode 会记住您的上一次会话 因此 如果关闭终端并退出 VSCode
  • 禁止非 PowerShell 命令的输出?

    我正在运行命令 hg st 然后检查它是 LASTEXITCODE检查当前目录中 Mercurial 的可用性 我不关心它的输出 也不想将它展示给我的用户 如何抑制所有输出 成功或错误 由于 Mercurial 不是 PowerShell
  • 替换第二个和第三个下划线之间的任何内容

    我有一个 PowerShell 脚本行 它用 替换 删除 第二个和第三个下划线之间的字符 get childitem pdf rename item newname name replace p L p L 例子 12345 00001 L
  • 无法在 Powershell 中运行 R.exe

    我经常发现在命令行 Windows 上运行 R 更有用 然而 当我在 Powershell 中尝试时 我往往会遇到问题 但这可以通过第一次运行轻松克服cmd然后就可以了 这是我执行此操作时遇到的错误R CMD BATCH Invoke Hi

随机推荐

  • Windows 10 中的 adb.exe 位于哪里?

    我在 Windows 10 上安装了 android studio 1 5 当我在命令行中输入 adb 我得到命令未找到 我可以从哪里获取它或者它安装在哪里 它位于AppData隐藏文件夹 C Users user AppData Loca
  • 更改 Java Swing 中 JButton 的边框颜色,保留插图

    我想更改 Java Swing 中 JButton 组件的边框颜色 我已经尝试过以下方法 package com example test import java awt Color import java util logging Lev
  • 解析矩阵的嵌套 for 循环的时间复杂度

    假设我有一个包含 X 行和 Y 列的矩阵 元素总数是 X Y 对吗 那么这是否使得 n X Y for i 0 i
  • Android APK 文件的 MD5 校验和不同。为什么?

    我注意到 如果我编译一个 Android 应用程序两次 一次紧接另一次且没有任何更改 则两个 APK 文件具有两个不同的 MD5 校验和 未签名和签名的 APK 文件都会产生相同的结果 您可以将其作为 ZIP 文件打开 其中的内容在两个文件
  • 使用唯一索引为列表建立索引

    我有一个清单说l 10 10 20 15 10 20 我想为每个唯一值分配一个特定的 索引 来获取 1 1 2 3 1 2 这是我的代码 a list set l res a index x for x in l 结果发现速度非常慢 l有
  • 对 UTF-8 字符串数组进行排序,以便平等对待无重音字母

    我正在尝试比较两个字符串 milie and Zoey Well E出现在之前Z但在 ASCII 图表上Z出现在之前 所以一个正常的if str1 gt str2 行不通的 我尝试过if strcmp str1 str2 gt 0 但这仍然
  • SAPUI5 视图,访问面板标题的模型项

    我有以下模型 categories 1 0 1 categoryDesc Production 2 0 1 2 categoryDesc Documentation 还有下面的景色
  • 可以在 Amazon S3 API 中使用伪“锁定”对象吗?

    我正在考虑使用 锁定 S3 对象 以防止对给定 S3 对象同时进行相同的操作 但我对这个技术方案的有效性抱有很大的怀疑 更准确地说 在对对象进行操作开始时 将创建与对象名称和所执行操作类型相对应的锁定文件 示例 在 myObject 上的
  • 进程异常终止时的资源清理

    我的问题是 当一个进程异常终止时 通过信号 它可能是 SIGKILL 所以我们无法拦截它 是否有任何保证的顺序或原子性来释放其资源 我特别对文件锁和共享内存感兴趣 例如 1 如果进程持有 2 个文件的锁并异常终止 是否有可能另一个试图锁定相
  • 使用 RxJS 进行 Angular 2 轮询

    我正在尝试轮询 RESTful 端点来刷新我的实时聊天消息 我知道实时聊天的最佳方法是 Websockets 我只是想了解 RxJS 如何与 Angular 2 配合使用 我想每秒检查一次新消息 我有以下代码 return Rx Obser
  • Docker Java 应用程序无法从控制台获取输入

    我正在尝试为我的 java 应用程序创建一个 docker 映像 启动时需要为该应用程序提供密码 当前通过控制台 我尝试了多种获取输入的方法 但都失败了 这是 docker 的限制吗 如果是 有解决方法吗 对于这个片段 Console co
  • 页面中脚本标记的位置如何影响其中定义的 JavaScript 函数?

    我读到你应该在中定义你的 JavaScript 函数标签 但是它的位置如何
  • 跨线程操作在 C# 中无效[重复]

    这个问题在这里已经有答案了 可能的重复 跨线程操作无效 从创建它的线程以外的线程访问控制 https stackoverflow com questions 142003 cross thread operation not valid c
  • RTSP RTP 客户端流、时间戳、live555

    我有一个位于不同国家 地区的网络摄像机 具有不同的时区 并且应用了它自己的日期时间值 例如 2012 04 16 11 30 00 然后是我的电脑所在的位置 例如我的电脑时间是 2012 14 16 06 10 00 我的目的 流式传输时
  • 使用bash(最好是sed)命令删除markdown(md)文件中的图像和链接标签

    我在 git wiki 上有 markdown md 文件 我正在将其更改为 html 我不想在 html 文件中包含图像和链接 我们的 Markdown 图像如下所示 Alt text path to img jpg Optional t
  • 如何根据经度和纬度过滤geodjango

    我有一个存储经度和纬度的应用程序 现在我想将它与 geodjango 集成 应用程序如下所示 class Location models Model other fields here lat models CharField blank
  • Typescript:在静态方法中使用子类

    在 TypeScript 中 我使用了操场 https www typescriptlang org play 版本 4 13 当我从一个类继承时 this里面一个static父类的方法似乎引用了继承类 class Parent stati
  • CSS 动画填充模式和 z-index 问题

    我在我正在进行的项目中使用 CSS 动画 来自 animate css 我发现 当淡入其中包含绝对定位和 z 索引子项的容器时 子项的 z 索引无法正常工作 我在这个小提琴中重新创建了这个问题 http jsfiddle net Lxsf9
  • Sitecore 软件包安装永无止境

    我遇到了一个有趣的问题 当我安装 Sitecore 软件包时 当软件包完全安装后 用户界面永远不会更新 Sitecore 软件包安装挂起 在 Sitecore 日志中我看到 ManagedPoolThread 18 11 36 00 INF
  • 如何在远程计算机上的 Invoke-Command 引发的异常中保留 ScriptStackTrace?

    我正在编写一个 Powershell 脚本 它执行构建 部署过程中的步骤之一 并且需要在远程计算机上运行一些操作 该脚本相对复杂 因此如果在远程活动期间发生错误 我需要详细的堆栈跟踪来了解脚本中发生错误的位置 在已生成的日志记录之上 出现问