&&をPowershellで動作させることはできますか?


186

&&グーグルで検索することは悪名高いが悪名高いが、私が見つけた最高のものはを使うように言うこの記事である-and

残念ながら、それはこれ以上の情報を提供せず、私が何をすることになっているのかを見つけることができません-and(これも、悪名高いほど検索が難しいことです)

私がそれを使用しようとしているコンテキストは、「cmd1を実行し、成功した場合はcmd2を実行する」で、基本的には次のとおりです。

csc /t:exe /out:a.exe SomeFile.cs && a.exe

これは、知っている人にとっては簡単ないくつかの担当者ポイントになるはずです。ありがとうございます。


編集:1行で複数のコマンドを実行したいだけで、最初のコマンドが失敗するかどうかを気にしない場合は、使用できます;私の目的のほとんどはこれで問題ありません

例:kill -n myapp; ./myapp.exe


PowerShellには、論理演算子が含まれています。オペレーターは期待どおりに働いていませんか?もしそうなら、あなたはここに表現を投稿することができます。
Mohit Chakraborty、

この質問を参照してください、それはあなたが欲しいものを行います。stackoverflow.com/questions/1917271/...
joshperry

2
誰がバッシュスタイルに興味を持っている&&||のPowerShellの一部になって:機能のためにしてください投票ここに
mklement0 2017年

1
リテラル(および重要な)記号を含むクエリのWeb検索を実行する必要性について:SymbolHoundはこれに役立ちます。質問に関連するいくつかの例を次に示します。powershell && ; powershell-およびDuckDuckGoを使用している場合は、を介してSymbolHoundを検索できます!sym
nisavid

3
2019年6月の更新:PowerShellチームが実装し&&||!で重量を量るGitHubのPR
pilau

回答:


193

CMDでは、「&&」は「コマンド1を実行し、成功した場合はコマンド2を実行する」を意味します。私はそれを次のようなことに使用しました:

build && run_tests

PowerShellで実行できる最も近いことは次のとおりです。

(build) -and (run_tests)

ロジックは同じですが、コマンドからの出力テキストは失われます。たぶんそれはあなたのために十分です。

スクリプトでこれを実行している場合は、おそらく次のようにステートメントを分離する方が良いでしょう。

build
if ($?) {
    run_tests
}

2019/11/27&&オペレーターがPowerShell 7 Preview 5以降で利用可能になりました:

PS > echo "Hello!" && echo "World!"
Hello!
World!


2
RE:「彼らが削除するのはばかげている」-私は、PowerShellを「愚かな部分が削除されたCMD」だと考えたくありません。 is.gd/k92B
ジェイBazuzi

90
私は、PowerShellを「愚かな部分が削除されたCMD」だと考えたくありません。私はそれを「有用なビットのないバッシュ」と考えたいです。
ポッド

15
build ; if ($?) { run_tests }コマンドラインでも行うことができます。
docwhat

19
PowerShellを習得するときに本当のフラストレーションを感じる最も簡単な方法は、それが単なる拡張CMDまたはbashであると考えることから始めることです。特に入力、出力、パイピング、および結果に関しては、根本的に異なるモデルがあります。良いチュートリアルや概要から始め、他のシェルの構文が機能するように頑張らないでください。あなた自身の条件でそれを取る必要があります。
Mark Meuer、2017

3
PowerShellを独自の用語で考えて、コマンドを実行し、そのコマンドが成功した場合にのみ別のコマンドを実行するにはどうすればよいですか?それがbashPowerShell の印象的なアイデアだとは思いません。基本的なシェル機能です。これまでのところ、私が見た中で最高のものはbuild ; if ($?) { run_tests }、これから使用するものです。PowerShellチームが&&サポートを追加してくれることを願っています!
ネイト

28

&&および|| 実装するもののリストにありました(まだあります)が、次に追加する最も有用なものとしてポップアップしませんでした。その理由は、-ANDと-ORがあるためです。それが重要であると思われる場合は、Connectに提案を提出してください。V3の場合は考慮します。


11
Connectにサインアップして、Powershellにノミネートしましたが、提案を行う方法がわかりません。コネクトのウェブサイトは本当に複雑で紛らわしいです:-(
Orion Edwards

6
既存のリクエストが見つからなかったため、次のリクエストを行いました。connect.microsoft.com
Andy Arismendi

22
ご存知のように、質問はまだ同等のものをどのように書くかであり、使用 例を追加すると、回答がはるかに役立ちます-AND
Kyeotic

5
これは、Windowsよりも古いシステムでほぼ永久に使用される基本的なフロー制御ツールであるため、重要です。したがって、LinuxとWindowsの間にまだ他の重大な違いがあります。
airtonix 2016

6
私はジェフリー・スノーバーが聞いていることを望みます、このSOは今までにそれを実装する十分な理由になるはずです。長すぎるため、PowerShellがVSCodeをWindowsのデフォルトのターミナルとして使用するように、場所でポップアップを開始します。これは&&なしの完全な痛みであり-and、出力はまったく同じではありません。
Ciantic 2017年

13

これを試して:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe

9
注:最初のコマンドが失敗しても、2番目のコマンドは引き続き実行されます。
BrunoLM 2016年

4
設定変数$ErrorActionPreferenceは、コマンドレットによって報告された非終了エラーの処理方法のみを管理します。外部などのユーティリティcsca.exe決しては(彼らは彼らの終了でステータスを反映、このようなエラーを報告$?成功フラグ()と$LASTEXITCODE、これまでお使いのコマンドライン量(特定の終了コードが報告された))無条件の実行の両方のコマンド(の同等cmdさんをcsc /t:exe /out:a.exe SomeFile.cs & a.exe
mklement017年

5

コマンドがcmd.exe(たとえば、python ./script.pyPowerShellコマンドではないii .(エクスプローラーで現在のディレクトリを開く)のようなもの)で使用できる場合、PowerShell内でcmd.exeを実行できます。構文は次のとおりです。

cmd /c "command1 && command2"

ここで&&、この質問で説明されているcmd構文によって提供されます。


4
cmdにアップグレードして、追加機能にアクセスしてください。
Bill K

4

PowerShellで次の一連のコマンドを試しました。

最初のテスト

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null)返された、真(Get-Content $MyVar)も返さ

2番目のテスト

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null)falseを返しましたが、これまでのところ、false(Get-Content $MyVar)も返したと想定する必要があります

3番目のテストでは、2番目の条件が分析されていないことが証明されました。

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null)返された及び第2の条件が証明(Get-Content "C:\MyTxt.txt")返すことで、走ったことがない偽のコマンド全体に。


あなたは正しいです!これは&&演算子として動作します。右側の$()でもこれを評価することはできません!
Falco Alexander

2

非常に古い質問ですが、初心者向けです。おそらく、質問が探しているPowerShellバージョン(類似しているが同等ではない)は、-and次のように使用します。

(build_command) -and (run_tests_command)


1
これはユースケースには問題ないかもしれませんが&&、の終了コードを無視するという点で、のようには動作しませんbuild_command
Simon Buchan

これは間違いなく正しいことではありません。最初のコマンドが失敗した場合でも、2番目のコマンドを実行します。
ネイト

これは完全に間違っています。in cmdおよびbash と;同等です。これは間違いなく同じではありませんCMDで&;&&
phuclv

また、両方のプロセスのSTDOUTおよびSTDERRをミュートします。
Dragas

0

コンテキストによって異なりますが、「-and」の動作例を次に示します。

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

つまり、ファイル名が「f」で始まるディレクトリにある10kbを超えるすべてのファイルを取得しています。


1
これは、複数のコマンドの実行に関する元の質問に対する回答ではありません。
bdukes 2014年

0
if (start-process filename1.exe) {} else {start-process filename2.exe}

"&&"より少し長いですが、スクリプトを書かなくても同じことを実行でき、覚えるのも難しくありません。遅れることはない。:)


2
Start-Processコマンドラインユーティリティの呼び出しに使用するツールとしては一般的に不適切です。具体的には、ここで使用されているように、新しいコンソールウィンドウで非同期にStart-Process実行され、何もfilename1.exe返しません$false。ブール値のコンテキストでは、と評価されます。省略した場合でもStart-Process(コマンドラインユーティリティを直接呼び出す必要があります)、アプローチは不十分です。条件付きの結果は、ユーティリティが標準出力を生成したかどうかに依存するためです。成功したかどうか。
mklement0 2017年

0

私は単純なifステートメントでこれを達成できると思います。最後の終了ステータスを超えるmkelement0の応答が$?に格納されているのを確認したら、次のようにまとめます。

# Set 1st command to variable
$a=somecommand

# Temp var to store exit status of last command (since we can't write to $?)
$test=$?

# Run Test
if ($test=$true) { 2nd-command }

したがって、opの例では、次のようになります。

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }

0

詳細な同等物は、$LASTEXITCODEとを組み合わせること-eq 0です:

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

なぜif ($?)うまくいかなかったのかはわかりませんが、これはうまくいきました。


-1

&&メソッドを使用する代わりに、このコマンドを試すことができます

{ホスト名; if($ lastexitcode -eq 0){ipconfig / all | findstr / i bios}} catch {echo err}最後に{}


必要はありませんtry/ catchそれだけのために必要とされるので、終了などの外部のユーティリティのエラー、hostnameipconfigとはfindstrトリガすることはできませんが。チェック$LASTEXITCODEは、外部ユーティリティによって設定された特定の終了コードを知りたい場合にのみ必要です$?。ネイティブのコマンドレットと同様に、抽象的な成功または失敗がに反映されます。
mklement0 2017年

@Cyber​​ironは正しい方向に進んでいると思います。私が思うに&&、それは新しいブロック(IEで後続のコマンドをラップする必要がない点で、UNIXでのtry / catchのようにたくさんある}とき、短絡後のコマンド(これらをスキップ))。私は、PowerShell への移植の非常に便利な代替となるAmpAmpときにスローする関数/フィルターを考えています。使用法if (!?) { throw "last command failed" }&&csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.