Выполнить процесс условно в Windows PowerShell (например, операторы && и || в Bash)
Мне интересно, знает ли кто-нибудь о способе условного выполнения программы в зависимости от успеха выхода/отказа предыдущей программы. Есть ли способ для меня выполнить программу2 сразу после program1, если программа1 успешно завершена без тестирования переменной LASTEXITCODE? Я пробовал работать с операторами -band и -s без каких-либо изменений, хотя у меня было ощущение, что они не будут работать в любом случае, и лучший заменитель - это комбинация точки с запятой и оператора if. Я имею в виду, когда дело доходит до создания пакета несколько автоматически из источника в Linux, && оператор не может быть избит:
# Configure a package, compile it and install it
./configure && make && sudo make install
PowerShell потребовал бы, чтобы я сделал следующее, предположив, что могу использовать одну и ту же систему сборки в PowerShell:
# Configure a package, compile it and install it
.\configure ; if ($LASTEXITCODE -eq 0) { make ; if ($LASTEXITCODE -eq 0) { sudo make install } }
Конечно, я мог бы использовать несколько строк, сохранить их в файле и выполнить script, но идея состоит в том, чтобы он был кратким (сохраняйте нажатия клавиш). Возможно, это просто разница между PowerShell и Bash (и даже встроенной командной строкой Windows, которая поддерживает оператор & &), мне нужно будет приспособиться, но если есть более чистый способ сделать это, d любить знать.
Ответы
Ответ 1
Вы можете создать функцию для этого, но нет прямого способа сделать это, о котором я знаю.
function run-conditionally($commands) {
$ranAll = $false
foreach($command in $commands) {
invoke-command $command
if ($LASTEXITCODE -ne 0) {
$ranAll = $false
break;
}
$ranAll = $true
}
Write-Host "Finished: $ranAll"
return $ranAll
}
Затем назовите его похожим на
run-conditionally(@(".\configure","make","sudo make install"))
Есть, вероятно, несколько ошибок там, где нет манжеты без удобной среды с удобством.
Ответ 2
Мне действительно было больно и из-за отсутствия &, поэтому написал следующий простой script на основе ответа GrayWizardX (который не работает как есть):
foreach( $command in $args )
{
$error.clear()
invoke-command $command
if ($error) { break; }
}
Если вы сохраните его как rc.ps1 (для "run conditionally" ) в каталоге вашего пути, вы можете использовать его как:
rc {.\configure} {make} {make install}
Использование блоков script (фигурные скобки) в качестве аргументов вместо строк означает, что вы можете использовать вкладку при вводе команд, что намного приятнее. Этот script почти так же хорош, как &, и работает.