【问题标题】:Running an executable through PowerShell and having it properly return the executable'^s error code通过 PowerShell 运行可执行文件并让它正确返回可执行文件的错误代码
【发布时间】:2017-01-19 08:07:45
【问题描述】:

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

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

$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 来做我想做的事情,所以我愿意接受有关如何修改此脚本的任何建议。

谢谢, 菲尔

【问题讨论】:

标签: powershell executable remote-access


【解决方案1】:

我认为这正是你想要的。

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

其次,为了捕获退出代码,您的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 中的变量分配有点困惑。史诗般的 $fileName 变量是如何获得赋值的。我也不太确定 $output 变量是如何工作的,但我确信我可以自己研究。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2016-12-25
    相关资源
    最近更新 更多