私の問題に対処する質問はすでにあります( &&をPowershellで機能させることはできますか? )が、1つの違いがあります。両方のコマンドから[〜#〜]出力[〜#〜]が必要です。ほら、実行しただけなら:
(command1 -arg1 -arg2) -and (command2 -arg1)
出力は表示されませんが、stderrメッセージは表示されます。そして、予想どおり、次のように入力します。
command1 -arg1 -arg2 -and command2 -arg1
構文エラーが発生します。
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}
_
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
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 ??=
最も簡単な解決策は
powershell command1 && powershell command2
コマンドシェルで。もちろん、これを.ps1スクリプトで使用することはできないため、その制限があります。
少し長い方法は以下を参照してください
try {
hostname
if ($lastexitcode -eq 0) {
ipconfig /all | findstr /i bios
}
} catch {
echo err
} finally {}