运行 一个通过 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
我正在尝试 运行 使用 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