Windows CMDで2つのコマンドを1行で実行するにはどうすればよいですか?


回答:


1321

2000年以降のすべてのMicrosoft OSでこのようになり、今日でも良好です。

dir & echo foo

最初のコマンドが正常に終了した場合にのみ2番目のコマンドを実行する場合:

dir && echo foo

1行で複数のコマンドを実行する単一のアンパサンド(&)構文は、Windows XP、Windows 2000、および一部の以前のNTバージョンに戻ります。(少なくとも4.0、ここの1人のコメント者によると。)

これについては、このページを下にスクロールするとわかるかなりの数のポイントがあります。

教育的であると思われる人のために、過去のデータが続きます。

それ以前は、&&構文は、Microsoftコマンドインタープリターに追加される前のシェル置換4DOSの機能にすぎませんでした。

Windows 95、98、およびMEでは、代わりにパイプ文字を使用します。

dir | echo foo

MS-DOS 5.0以降では、一部の以前のWindowsおよびNTバージョンのコマンドインタープリターを通じて、(文書化されていない)コマンドセパレーターは文字20(Ctrl + T)でしたが、ここでは^ Tで表します。

dir ^T echo foo

26
少なくともNT 4まで
ジョーイ

17
Win 8.0および8.1でも動作します。
MEMark 2013年

5
@Fallenreaper、それはまっすぐcmdなプロンプトでも機能するので、侵入するのは悪い習慣ではないと思います。:)

6
@Fallenreaper 2つの間の実際的な違いを認識していることを確認してください。
Moshe Katz

8
わかった。A && B、Bは、Aが成功した場合にのみ実行されますが、A&Bは、Aの結果に関係なく、Aの後にBを実行します。頭を上げてくれてありがとう
Fallenreaper 14

579

ドキュメントからの引用:

複数のコマンドと条件付き処理シンボルの使用

条件付き処理シンボルを使用して、単一のコマンドラインまたはスクリプトから複数のコマンドを実行できます。条件付き処理シンボルを使用して複数のコマンドを実行すると、条件付き処理シンボルの右側にあるコマンドは、条件付き処理シンボルの左側にあるコマンドの結果に基づいて動作します。

たとえば、前のコマンドが失敗した場合にのみコマンドを実行することができます。または、前のコマンドが成功した場合にのみコマンドを実行することもできます。

次の表に示す特殊文字を使用して、複数のコマンドを渡すことができます。

  • & [...]
    command1 & command2
    1つのコマンドラインで複数のコマンドを区切るために使用します。Cmd.exeは最初のコマンドを実行し、次に2番目のコマンドを実行します。

  • && [...]
    command1 && command2
    &&に続くコマンドを実行するには、シンボルの前のコマンドが成功した場合のみ使用します。Cmd.exeは最初のコマンドを実行し、最初のコマンドが正常に完了した場合にのみ2番目のコマンドを実行します。

  • || [...]
    command1 || command2
    次のコマンドを実行するために使用します|| ||の前にあるコマンドのみ 失敗します。Cmd.exeは最初のコマンドを実行し、最初のコマンドが正常に完了しなかった(0より大きいエラーコードを受け取った)場合にのみ2番目のコマンドを実行します。

  • ( ) [...]
    (command1 & command2)
    複数のコマンドをグループ化またはネストするために使用します。

  • ; or ,
    command1 parameter1;parameter2
    コマンドパラメータを区切るために使用します。


41
お試しくださいcmd /c "echo foo & echo bar"
ライハン

2
vagrant up && vagrant sshWindowsの10に引用符なしで働いていた
furman87

ありがとう!私はsingeについて知りませんでした&-非同期にして両方を並行して実行します。&&同期で使用していて、最初が成功した場合にのみ続行するため、スタックしました!
TetraDev 2016年

1
ドキュメントのリンクが壊れ、新しい場所technet.microsoft.com/en-us/library/bb490954.aspx
nkef

7
@TetraDev &は、コマンドを非同期または並列にしません。完了command1 & command2に実行さcommand2 command1ます。の成功または失敗command1は無関係です。
bornfromanegg 2017

74

&以下のためのバッシュと同等である;(実行コマンド)と&&のバッシュと同等である&&(以前はエラーが発生していないだけで実行するコマンド)。


1
これは、csh、tcsh、その他多くのシェルにも当てはまります。;Linuxではこれまで見たことがない
phuclv 2014年

10
@LưuVĩnhPhúcは、shスタイルのシェルで;、最初のコマンドを実行し、それが完了するのを待ってから、2番目のコマンドを実行することを意味します。&最初のコマンドを実行し、それをバックグラウンドにして、2番目のコマンドを実行することを意味します。したがって、両方のプログラムが同時に起動します。これらは結合シンボルではなく、最初のコマンドの末尾のシンボルであることに注意してください。progname &2つ目のコマンドがなくても、1つのコマンドをバックグラウンドで起動できます。
MM


19

(デスクトップなどで)cmdショートカットを作成する場合は、/ kパラメータを追加します(/ kは保持を意味し、/ cはウィンドウを閉じます)。

cmd /k echo hello && cd c:\ && cd Windows

16

callを使用して、評価が早すぎる環境変数の問題を克服できます-例

set A=Hello & call echo %A%

1
これは、変数がまだ設定されていない場合にのみ機能します。この場合、は新しい値ではなく古い値をecho出力します。少なくとも、これは私のWindows 7ボックスで観察したものです。
クレイグM.ブランデンブルク

最初にset A =を使用して、変数が設定されていないことを確認します。
SSi 2016年

1
より良い方法は、(setlocal EnableDelayedExpansionスクリプトまたはでcmd /v)遅延展開を使用することです。次に例を示しますtimeout 5 && cmd /v /c echo !TIME! && echo %TIME%
ニック

5
新しい値を取得するには、最初のパーセントの後に^を使用します。A= Helloを設定し、echo%^ A%を呼び出します
Nicolas

9

同じ行で複数のコマンドを実行する場合、いくつかの処理シンボルを使用でき、場合によっては処理のリダイレクト、別の場合の出力の変更、または単に失敗する可能性があります。1つの重要なケースは、変数を操作するコマンドを同じ行に配置することです。

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1

上記の例にあるように、変数を使用するコマンドが同じ行に配置されている場合は、遅延展開を使用して変数値を更新する必要があります。変数にインデックスが付けられている場合は、%%修飾子を指定したCALLコマンドを使用して、同じ行でその値を更新します。

set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5

与えられた例は私にとってはうまくcmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
いき

8

cmd /c ipconfig /all & Output.txt

このコマンドはコマンドを実行Output.txtし、単一のコマンドでファイルを開きます


8

そのため、RegAsmコンテキストメニューから実行(アセンブリの登録)の特定のタスクを有効にしようとしました。私が抱えていた問題は、結果がフラッシュして、私がそれを読む前に消えてしまうことでした。そこでPause、コマンドが失敗したときに機能しないへのパイプを試しました(ここで、一時停止コマンドは.batスクリプト機能せず、バッチファイルコマンドの一時停止は機能しません)。だから私は試しましたcmd /kが、それはより多くのコマンドのためにウィンドウを開いたままにします(私は結果を読みたいだけです)。追加私はpause続いexit以下で、その結果、チェーンに:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit

これはチャームのように機能します。RegAsmはファイルに対して実行され、その結果を表示します。次に、「Press any key to continue ...」というプロンプトが表示され、キーが押されるとコマンドプロンプトウィンドウが閉じます。

PS興味のある他の人のために、次の.regファイルエントリを使用して.dllファイルにdllfileの関連付けを追加し、それにRegAsmコマンド拡張を追加できます(エスケープされた引用符とバックスラッシュに注意してください)。

[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"

[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"

これで、アセンブリを登録するための右クリックメニューができました。



4

2つのコマンドを同時に実行するには、2つのコマンドの間に&(アンパサンド)記号を挿入する必要があります。そのようです:

color 0a & start chrome.exe

乾杯!


4

同じウィンドウで2つのpingを実行しようとしましたが、これは同じ行のシリアルコマンドです。最初のコマンドを終了した後、2番目のコマンドを実行します。

解決策はstart /b、Windows 7のコマンドプロンプトでと組み合わせることでした。

なし/bで通常どおり起動し、別のウィンドウで起動します。

同じ行で起動するために使用されるコマンドは次のとおりです。

start /b command1 parameters & command2 parameters

いずれにしても、出力を解析したい場合は、これを使用することはお勧めしません。コマンドの出力間で出力がスクランブルされていることに気づきました。


4

さて、あなたは2つのオプションがあります:配管、または単に&

DIR /S & START FILE.TXT

または、

tasklist | find "notepad.exe"

パイピング(|)は、1つのコマンドの出力を取得して別のコマンドに出力するためのものです。そして(&)はこれを実行することを言っているだけです。


あなたは何をするか、いくつかの説明が含まれるように、あなたの投稿を編集でした&し、|やると、すべての場合、彼らは、どのように異なりますか?現在、これらの概念に不慣れな人は、自分の場合にどちらを使用するかを自分で決めることができません。
MirekDługosz17年

私としては。私の悪い。すぐに投稿を編集します。感謝します。
PyDever 2017年

単に「見つける」の代わりに「findstr」にする必要があります
Anu Shibin Joseph Raj

2

いいえ、cd / && tree && echo %time%。エコーされる時間は、最初のコマンドが実行されたときです。

配管にはいくつかの問題がありますが、人々がそれがどのように機能するかを知っている限り、それは重要ではありません。


1

もう1つの例:たとえば、gulpビルドシステムを使用する場合、

gulp -デフォルト>ビルド

gulp build -ビルドビルドフォルダー

gulp watch -ファイルウォッチを開始

gulp dist -dist-folderをビルドします

これは1行で実行できます。

cd c:\xampp\htdocs\project & gulp & gulp watch

1

変数を1行で使用または操作しようとすると、その内容に注意してください。たとえば、次のような変数

PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

そのまま使用すると、手に負えないトラブルが多発する可能性があります。 %PATH%

  1. 閉じ括弧はグループステートメントを終了します
  2. 二重引用符を使用する%PATH%と、括弧の問題を処理できません
  3. そして、どのような参照変数が%USERPROFILE%含まれますか?

2
これはWindows CMDで2つのコマンドを1行で実行することとどう関係していますか?
Peter Mortensen 2017

1

使用&1行でコマンドを使用するには、ウィンドウ内のシンボル

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook

Linuxのように

touch thisfile ; ls -lstrh

0

はいあります。です&

&& コマンド1が失敗しない限り、コマンド1が完了するとコマンド2が実行されます。

& 関係なく実行されます。


-2

それは簡単です:&&標識で区別するだけです。例:

echo "Hello World" && echo "GoodBye World".

「ハローワールド」の後に「さようならワールド」が掲載されます。


6
同じことを示す古い回答がすでにあるという事実とは関係なく、それはまだ正確ではありません。&&されている条件最初のコマンドは、(ERRORLEVEL = 0)succeded場合、オペレータ、次のコマンドは、実行されている
ジェブ

もちろん。人が2つのコマンドを実行したい場合、それらの2つが正しく、すべてがうまくいくかどうかは自明です
Rajan Dhanowa

1
Rajan:彼は「次のコマンドは最初のコマンドが成功した場合にのみ実行される」という意味です。
イヴァン

2
Goodbye WorldはHello Worldの後に印刷されます」印刷Hello Worldが失敗しなかった場合。@jebが言ったように、&&条件付きです。&前のコマンドが成功したかどうかに関係なくコマンドを実行します。
Pranav A. 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.