2017-01-18 4 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

Возможный дубликат [Получение ExitCode с помощью Start-Process и WaitForExit вместо -wait] (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

Это похоже на то, что я ищу. Я, кажется, немного запутался в присваивании переменных в powershell. Эпически относительно того, как переменная $ fileName получает назначенное значение. Я также не совсем уверен, как работает переменная $ output, но я уверен, что смогу самостоятельно исследовать ее. –

0

Вы передавая аргумент в блок сценария? Замените $FileName на $($Args[0]) и добавьте -ArgumentList $FileName в параметры Invoke-Command.

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

 Смежные вопросы

  • Нет связанных вопросов^_^