web-dev-qa-db-ja.com

PowerShellでの条件付き実行(&&および||)

私の問題に対処する質問はすでにあります( &&をPowershellで機能させることはできますか? )が、1つの違いがあります。両方のコマンドから[〜#〜]出力[〜#〜]が必要です。ほら、実行しただけなら:

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

出力は表示されませんが、stderrメッセージは表示されます。そして、予想どおり、次のように入力します。

command1 -arg1 -arg2 -and command2 -arg1 

構文エラーが発生します。

33
Andy

2019:Powershellチームは _&&_のサポートをPowershellに追加することを検討しています-このGitHub PRで検討してください

これを試して:

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

$()は、パイプラインを含めて複数のステートメントを指定できるようにする部分式です。次に、コマンドを実行し、_Out-Host_にパイプして、確認できるようにします。次のステートメント(部分式の実際の出力)は_$?_、つまり最後のコマンドの成功結果を出力する必要があります。


_$?_は、ネイティブコマンド(コンソールexe)の場合は問題なく機能しますが、コマンドレットの場合、必要なものが残ります。つまり、_$?_は、コマンドレットで終了エラーが発生した場合にのみ_$false_を返すようです。 _$?_には少なくとも3つの状態(失敗、成功、および部分的に成功)が必要なようです。したがって、コマンドレットを使用している場合、これはより適切に機能します。

_$(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}
_
28
Keith Hill

doThis || exit 1が本当に役立つマルチステップスクリプトを簡略化するには、次のようにします。

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

doThis; ProceedOrExit
doNext

# or for long doos
doThis
ProceedOrExit
doNext
3
dadhi
  • Bashの/ cmd&&および||の制御演算子には、PowerShellに相当するものがありません。カスタムを定義できないためPowerShellの演算子、良い回避策はありません

    • キース・ヒルの答え| Out-Hostベースの回避策は、通常のコマンド出力のみをconsole(ターミナルに送信できるという点で、厳しく制限されています)、出力がパイプライン経由で送信されたり、変数やファイルにキャプチャされたりするのを防ぎます。

私の この答え で背景情報を見つけてください。

1
mklement0

Powershell 7.0がリリースされ、&&および||はサポートされています

https://devblogs.Microsoft.com/powershell/announcing-powershell-7-0/

New operators:
  Ternary operator: a ? b : c
  Pipeline chain operators: || and &&
  Null coalescing operators: ?? and ??=
0
Sunbreak

最も簡単な解決策は

powershell command1 && powershell command2

コマンドシェルで。もちろん、これを.ps1スクリプトで使用することはできないため、その制限があります。

0
cowlinator

少し長い方法は以下を参照してください

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