运行 一个通过 PowerShell 的可执行文件并正确地拥有它 return 可执行文件的错误代码

Running an executable through PowerShell and having it properly return the executable'^s error code

我正在尝试 运行 使用 PowerShell 中来自远程计算机的参数的可执行文件,虽然我已经让 PowerShell 命令工作,但它没有正确处理可执行文件抛出的错误。

所以只要 $filename 指向的文件存在,下面的脚本就会按预期执行,但如果文件不存在,脚本也会执行成功,这会导致我试图绑定的调度程序出现问题这成。我的预期是 PowerShell 会抛出 "File not found" 之类的错误,但这并没有发生。那么有什么我可以添加到这个脚本中来实现这种行为的吗?

$ErrorActionPreference = "stop"
$rSession = New-PSSession -ComputerName ServerName
$fileName = c:\file.txt
Invoke-Command -ScriptBlock {Start-Process -FilePath "D:\CAMRA\PFX\PFLNS.EXE" -ArgumentList " /SD:\CAMRA\CAMINI\Z_PRODNP_SQL_TEST.INI GLSWEEP 50 {DN}~$fileName~{T}" -Wait} -Session $rSession
Remove-PSSession $rSession

也有可能是我没有通过 PowerShell 正确调用 .exe 来执行我想要的操作,因此我愿意接受有关如何修改此脚本的任何建议。

谢谢, 菲尔

您是否将参数传递给脚本块?将 $FileName 替换为 $($Args[0]),并将 -ArgumentList $FileName 添加到 Invoke-Command 的参数中。

... GLSWEEP 50 {DN}~$($args[0])~{T}" -Wait} -ArgumentList $FileName -Session $rSession

我认为这正是您想要的。

首先,我将命令分解成一个单独的脚本块,这样我们就可以添加一些额外的代码来捕获错误的退出代码。

其次,为了捕获退出代码,您的 Start-Process 需要有 -PassThru 参数。一旦我们可以捕获退出代码,我们将对其进行评估,如果它不是 0(好),则抛出一个错误,使更高层崩溃 Invoke-Command.

第三,我们必须使用特殊的$?变量来捕获上一个命令(Invoke-Command)是否成功,如果不成功,它会抛出一个错误,这可能被调度程序捕获。

$ErrorActionPreference = "stop"
$rSession = New-PSSession -ComputerName ServerName
$arg = "c:\file.txt"

$ScriptBlock = {
     param ([String]$fileName)
     $output = Start-Process -FilePath "D:\CAMRA\PFX\PFLNS.EXE" -ArgumentList " /SD:\CAMRA\CAMINI\Z_PRODNP_SQL_TEST.INI GLSWEEP 50 {DN}~$fileName~{T}" -Wait -PassThru
     if ($output.ExitCode -ne 0) {
          throw $output.ExitCode
     }  
}

Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList $Arg -Session $rSession
if (!$?) {
     #Failure Throw an error code
     throw 123
}

Remove-PSSession $rSession