условное исполнение (&& и ||) в powershell - PullRequest
29 голосов
/ 12 февраля 2010

Уже есть вопрос, касающийся моей проблемы ( Можно ли заставить && работать в Powershell? ), но с одним отличием. Мне нужно OUTPUT от обеих команд. Смотри, если я просто бегу:

(command1 -arg1 -arg2) -and (command2 -arg1)

Я не увижу ничего, кроме сообщений stderr. И, как и ожидалось, просто набрал:

command1 -arg1 -arg2 -and command2 -arg1 

Дает синтаксическую ошибку.

Ответы [ 5 ]

27 голосов
/ 12 февраля 2010

Попробуйте это:

$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)

$() - это подвыражение, позволяющее вам указать несколько операторов, включая конвейер. Затем выполните команду и передайте Out-Host, чтобы вы могли ее видеть. Следующий оператор (фактический вывод подвыражения) должен вывести $?, то есть результат успешного выполнения последней команды.


$? отлично работает для нативных команд (консоли exe), но для командлетов оставляет желать лучшего. То есть $?, похоже, возвращает $false только тогда, когда командлет обнаруживает завершающую ошибку. Похоже, что $? нужно как минимум три состояния (сбой, успешный и частично успешный). Поэтому, если вы используете командлеты, это работает лучше:

$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and 
$(command -arg1 -ev err | Out-Host;!$err)

Этот вид ударов все еще. Возможно, что-то вроде этого будет лучше:

function ExecuteUntilError([scriptblock[]]$Scriptblock)
{
    foreach ($sb in $scriptblock)
    {
        $prevErr = $error[0]
        . $sb
        if ($error[0] -ne $prevErr) { break }
    }
}

ExecuteUntilError {command -arg1 -arg2},{command2-arg1}
3 голосов
/ 26 ноября 2013

Для упрощения многошаговых скриптов, где doThis || выход 1 был бы действительно полезен, я использую что-то вроде:

function ProceedOrExit { 
    if ($?) { echo "Proceed.." } else { echo "Script FAILED! Exiting.."; exit 1 } 
}

doThis; ProceedOrExit
doNext

# or for long doos
doThis
ProceedOrExit
doNext
1 голос
/ 22 января 2017
  • Операторы управления Bash's / cmd * && и || не имеют эквивалентов PowerShell , и поскольку вы не можете определять пользовательские операторы в PowerShell, не годится обходные .

    • Обходной путь на основе | Out-Host в Ответ Кейта Хилла строго ограничен в том, что он может только отправлять нормальный вывод команды на консоль (терминал), предотвращая вывод из отправка по конвейеру или запись в переменную или файл.

Найти справочную информацию в этом ответе моего.

0 голосов
/ 14 декабря 2017

Самое простое решение - использовать

powershell command1 && powershell command2

в оболочке cmd. Конечно, вы не можете использовать это в скрипте .ps1, так что есть такое ограничение.

0 голосов
/ 21 января 2017

Немного длиннее - см. Ниже

try {
  hostname
  if ($lastexitcode -eq 0) {
    ipconfig /all | findstr /i bios
  }
} catch {
  echo err
} finally {}
...