2017-01-18 58 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 
相關問題