从Invoke-Command重定向错误

时间:2016-06-30 10:27:18

标签: powershell error-handling pipeline

我有一个脚本可以管理数百个虚拟服务器上的任务,它在作业中运行Invoke-Command并将详细信息输出到网页。

我的问题是在Invoke-Command脚本块中抛出的错误没有用管道输出:

此命令正确地管道错误(无法连接到服务器)并以字符串形式输出:

Invoke-Command [dead server] -ScriptBlock { Write-Error "Test" } *>&1 | Out-String

此命令似乎完全忽略了错误,根本不显示:

Invoke-Command [live server] -ScriptBlock { Write-Error "Test" } *>&1 | Out-String

此命令正确地将错误输出为字符串:

Invoke-Command [live server] -ScriptBlock { Write-Error "Test" *>&1 | Out-String }

使用第一个和第三个例子我可以把所有东西都拿出去,但事情并非如此简单。我可能需要使用这个来运行复杂的脚本,并且期望我重定向每个命令以便捕获错误是不合理的。

我甚至无法找到任何东西来包装它以便管好所有东西。

实际上一个函数可以工作,但它似乎是一个非常迂回的解决方案,因为似乎不是一种将脚本块转换为函数的方法,因此我必须将脚本块放入Invoke-在Invoke-Command中的函数中的命令,它位于PSSession中的作业中......

1 个答案:

答案 0 :(得分:1)

GitHub PowerShell\Remotely上有一些代码,我相信它可以做你想要的。

代码执行此操作:

  1. 首先调用Invoke-Command作为作业并等待作业,如下所示: $testjob = Invoke-Command -Session $sessions -ScriptBlock $test -AsJob -ArgumentList $ArgumentList | Wait-Job
  2. 然后它根据作业构造一个结果对象,给你每个流(至少大部分都是。)这是复杂的代码。
  3. 为了您的目的,代码很可能需要重构,因为它是用于测试的。

    如果你有时间,你应该能够重构它以满足你的需要。代码按原样为您提供了作为对象属性的流,但您应该能够将这些对象传递到您希望它们到达的位置(您只需要记住检查每个对象。)