Выполнить процесс условно в 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 почти так же хорош, как &, и работает.