Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 从Invoke命令重定向错误_Powershell_Error Handling_Pipeline - Fatal编程技术网

Powershell 从Invoke命令重定向错误

Powershell 从Invoke命令重定向错误,powershell,error-handling,pipeline,Powershell,Error Handling,Pipeline,我有一个脚本,可以管理数百个虚拟服务器上的任务,它在作业中运行Invoke命令,并将详细信息输出到网页 我的问题是调用命令scriptblock中抛出的错误未通过管道传输: 此命令正确地引导错误(无法连接到服务器)并以字符串形式输出: Invoke-Command [dead server] -ScriptBlock { Write-Error "Test" } *>&1 | Out-String Invoke-Command [live server] -ScriptBlock

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

我的问题是调用命令scriptblock中抛出的错误未通过管道传输:

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

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-Command [dead server] -ScriptBlock { Write-Error "Test" } *>&1 | Out-String
Invoke-Command [live server] -ScriptBlock { Write-Error "Test" *>&1 | Out-String }
使用第一个和第三个例子,我可以把所有的事情都说出来,但不是那么简单。我可能需要使用它来运行复杂的脚本,期望我重定向每一个命令以便发现错误是不合理的

我甚至找不到任何东西把它包起来,把所有的东西都排出来


实际上,函数可以工作,但它似乎是一个非常迂回的解决方案,因为似乎没有办法将scriptblock转换为函数,所以我必须将scriptblock放在Invoke命令中的Invoke命令中的函数中,这是在PSSession中的一个工作…

GitHub上有一些代码,我相信它能满足您的需要

该守则是这样做的:

  • 先将调用命令作为作业,然后等待作业,如下所示:
    
    $testjob=Invoke命令-Session$sessions-ScriptBlock$test-AsJob-ArgumentList$ArgumentList |等待作业
    
  • 然后它基于作业构造一个结果对象,为您提供每个流(至少大部分流)。这是一段复杂的代码
  • 由于代码是用于测试的,因此很可能需要为您的目的对其进行重构


    如果您有时间,您应该能够重构它以满足您的需要。代码按原样将流作为对象的属性提供给您,但您应该能够将这些对象输送到您希望它们去的地方(您只需记住检查它们中的每一个即可)。

    这里的问题是什么?为什么你希望
    *?&1
    能给你带来任何有意义的结果呢?哎呀,那是个打字错误。问题是,我如何将所有由Invoke命令生成或从其中生成的错误通过管道传输到输出流?特别是在我的例子中,它是到Foreach-Object的管道。您可以在
    $Error
    变量中找到所有错误…虽然不是问题的答案,但我可能可以使用$Error。。。幸运的是,这些脚本在遇到错误时都应该停止,并且它不包含在Invoke命令中处理或隐藏的错误…您的命令
    Invoke命令[live server]-ScriptBlock{Write error“Test”}*>&1 | Out String
    对我来说工作正常。+1对于有趣的答案,但是,如果我正确地解释了这一点,它将等待作业以
    Wait job
    完成,然后返回结果。稍后我将深入研究它,看看它是否真的做到了这一点,或者是否有办法调整它以实时输出。