Код возврата сценария вызова команды Powershell

Я работаю над сценарием развертывания для приложения поставщика. Он считывает XML-файл, в котором отображаются пути развертывания для различных сред, затем перебирает различные серверы, копирует правильные файлы и выполняет сценарий развертывания. Я хотел бы, чтобы сценарий завершился, если сценарий развертывания не работает. Сценарий развертывания — это сценарий Perl, и мне нужно перед этим вызвать .bat для установки набора переменных среды. Я выполнил все эти команды, объединенные с &, как вы можете видеть ниже, чтобы системные переменные, которые устанавливает env.bat, все еще были доступны при запуске скрипта perl:

$cmdString = $destDrive + ": & call "+$lesDestDir+"data\env.bat & cd "+$rolloutDir+" & perl ..\JDH-rollout-2010.pl "+$rollout+" NC,r:\les"
write-host "cmdString: " $cmdString
Invoke-Command -session $session -ScriptBlock {cmd /v /k `"$args[0]`"} -args $cmdString

Команда вызова будет выглядеть так с подстановкой переменных:

Invoke-Command -session $session -scriptblock {cmd /k "D: & call D:\XXXX\env.bat & cd D:\XXXX\RO-00102 & perl ..\JDH-rollout-2010.pl RO-00102 NC,r:\les"}

Итак, вопрос в том, как я могу получить код возврата из сценария Perl (который является последней командой в строке команд, выполняемых в контексте cmd) обратно на локальный компьютер, где выполняется сценарий? Любые другие предложения относительно моего подхода приветствуются, поскольку у меня ограниченный опыт работы с powershell.


person Justin Holbrook    schedule 01.08.2012    source источник
comment
Есть ли причина, по которой вы устанавливаете переменные среды из cmd, а не из Powershell?   -  person SpellingD    schedule 01.08.2012
comment
Да, это сценарий, предоставляемый поставщиком, который отличается для каждой среды. Я не хочу преобразовывать их скрипт в powershell, а затем нести ответственность за его поддержку, если их скрипт изменится.   -  person Justin Holbrook    schedule 01.08.2012


Ответы (1)


Вскоре я нашел решение. Я добавил эхо кода возврата в $cmdString, затем использовал команду вызова, чтобы вернуть удаленную переменную обратно в локальный экземпляр, затем я запросил результаты для кода возврата:

$cmdString = $destDrive + ": & call "+$lesDestDir+"data\env.bat & cd "+$rolloutDir+" & perl ..\JDH-rollout-2010.pl "+$rollout+" NC,r:\les & echo ExitCode:!errorlevel!"
write-host "cmdString: " $cmdString

Invoke-Command -session $session -ScriptBlock {$res = cmd /v /k `"$args[0]`"} -args $cmdString
$res = Invoke-Command -session $session {$res}    
Write-Host "Return code: " $res    
$res = [string] $res        
$exitCode = $res.substring($res.IndexOf("ExitCode:"), 10)     
Write-Host "Exit code: " $exitCode
person Justin Holbrook    schedule 01.08.2012