Попробуйте это:
$(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}