2017-01-18 27 views
0

我试图在PowerShell中的远程计算机上运行带有参数的可执行文件,而我已经得到了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 

这也可能是我没有正确地调用.exe文件通过PowerShell中做什么我期待,所以我将开放给任何建议我如何可修改该脚本。

感谢, 菲尔

+0

([使用启动过程和WaitForExit代替-Wait获得的ExitCode]的可能的复制http://stackoverflow.com/questions/10262231/obtaining-exitcode-using-start-process-and-waitforexit-而不是等待) – jveazey

回答

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 
+0

这似乎适用于我期待的功能。 虽然我似乎对变量赋值有点困惑。从字面上看,$ fileName变量是如何得到一个赋值的。我也不太确定$ output变量是如何工作的,但我相信我可以自己研究。 –

0

你传递参数给脚本块?与$($Args[0])更换$FileName并添加-ArgumentList $FileName为调用命令的参数。

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