Выполнить процесс условно в Windows PowerShell (например, операторы && и || в Bash) - PullRequest
7 голосов
/ 16 декабря 2009

Мне интересно, знает ли кто-нибудь способ условного выполнения программы в зависимости от успешного завершения / сбоя предыдущей программы. Могу ли я выполнить программу 2 сразу после программы 1, если программа 1 успешно завершает работу без тестирования переменной LASTEXITCODE? Я пробовал операторы -band и -and безрезультатно, хотя у меня было ощущение, что они все равно не будут работать, и лучшая замена - это сочетание точки с запятой и оператора 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 } }

Конечно, я мог бы использовать несколько строк, сохранить их в файле и выполнить скрипт, но идея в том, чтобы он был кратким (сохраняйте нажатия клавиш). Возможно, это просто разница между PowerShell и Bash (и даже встроенной командной строкой Windows, которая поддерживает оператор &&), к которой мне нужно будет приспособиться, но если есть более чистый способ сделать это, я бы хотел знать.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Вы могли бы создать функцию для этого, но я не знаю, как это сделать.

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"))

Там, вероятно, есть несколько ошибок, это не так, как будто не нужна среда PowerShell.

0 голосов
/ 01 августа 2011

Мне было очень больно из-за отсутствия &&, поэтому я написал следующий простой скрипт на основе ответа GrayWizardX (который не работает как есть):

foreach( $command in $args )
{
  $error.clear()
  invoke-command $command
  if ($error) { break; }
}

Если вы сохраните его как rc.ps1 (для «запуска по условию») в каталоге вашего пути, вы можете использовать его следующим образом:

rc {.\configure} {make} {make install}

Использование блоков скрипта (фигурных скобок) в качестве аргументов вместо строк означает, что вы можете использовать завершение табуляции при наборе команд, что намного приятнее. Этот скрипт почти так же хорош, как &&, и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...