web-dev-qa-db-ja.com

Windows CMDで1行に2つのコマンドを実行する方法を教えてください。

Windows CMDコンソールで2つのコマンドを実行したいです。

Linuxでは、このようにします

touch thisfile ; ls -lstrh

それはどのようにWindows上で行われますか?

777
flybywire

2000年以降のすべてのMicrosoft OSでこのようになっていますが、それでも今日でも問題はありません。

dir & echo foo

最初のコマンドが正常に終了した場合にのみ2番目のコマンドを実行したい場合は、次のようにします。

dir && echo foo

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

このページを下にスクロールすると、他にもかなり多くの点がわかります。

それが教育的であると感じるかもしれない人のための過去のデータが続きます。

それ以前は、&&構文は、シェルの代わりとなる4DOSの機能の1つに過ぎず、その機能はMicrosoftのコマンドインタプリタに追加されていました。

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

dir | echo foo

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

dir ^T echo foo
1005
djdanlib

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

複数のコマンドと条件処理記号の使用

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

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

次の表にリストされている特殊文字を使用して、複数のコマンドを渡すことができます。

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

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

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

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

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

519
Raihan

&;(実行コマンド)と同等のBashで、&&&&と同等のBashです(前のコマンドでエラーが発生していない場合にのみ実行します)。

65
manojlds

&を使用すると、コマンドを次々に実行できます。例:c:\dir & vim myFile.txt

23
scrappedcola

Cmdのショートカットを(デスクトップなどに)作成したい場合は、/ kパラメータを追加します(/ kはキープ、/ cはウィンドウを閉じます)。

cmd /k echo hello && cd c:\ && cd Windows
16
TroodoN-Mike

call を使用すると、環境変数の評価が早すぎるという問題を解決できます。

set A=Hello & call echo %A%
11
SSi

同じ行で複数のコマンドを実行するときには、いくつかの 処理記号 を使用できます。また、場合によっては処理のリダイレクト、別の場合には出力の変更、または単に失敗することがあります。 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
6
sambul35

そのため、コンテキストメニューからRegAsm(register Assembly)を実行するという特定のタスクを有効にしようとしていました。私が持っていた問題は、私がそれを読むことができる前に結果がフラッシュアップして消えるだろうということでした。そのため、コマンドが失敗したときには機能しないPauseへのパイピングを試みました(ここで言及されているように .batスクリプトではPauseコマンドが機能しない およびhere バッチファイルコマンドPAUSEは機能しません )。それで私はcmd /kを試みました、しかしそれはより多くのコマンドのために窓を開いたままにします(私はただ結果を読みたいです)。そのため、チェーンにpauseとそれに続くexitを追加すると、次のようになります。

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

これは魅力的なように動作します - RegAsmはファイルを実行してその結果を表示してから、「続行するには任意のキーを押してください...」というプロンプトが表示されます。

P.S興味のある人は、次の.regファイルエントリを使用して、.dllファイルにdllファイルの関連付けを追加し、それに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"

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

5
SNAFUBAR

cmd /c ipconfig /all & Output.txt

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

5
dpp.2325

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

color 0a & start chrome.exe

乾杯!

3
PryroTech

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

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

/bを付けずに通常どおりに起動し、別のウィンドウで起動します。

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

start /b command1 parameters & command2 parameters

いずれにせよ、もしあなたが出力をパースしたいのであれば、私はこれを使うことを勧めません。

3
sdcxp

さて、あなたには2つの選択肢があります:パイピング、あるいは単に&

DIR /S & START FILE.TXT

または、

tasklist | find "notepad.exe"

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

3
PyDever

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

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

1
notarealname

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

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

あなたが%PATH%としてそれを使うならば、多くの扱いにくいトラブルを引き起こすかもしれません

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

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

gulp - デフォルト>ビルド

gulp build - ビルドフォルダーをビルドする

gulp watch - ファイル監視を開始する

gulp dist - dist-folderをビルドする

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

cd c:\xampp\htdocs\project & gulp & gulp watch
0
Mile Mijatovic

はいあります。それは&です。

&1は、コマンド1が完了したときにコマンド2を実行します。

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

簡単です。 &の記号で区別してください。 例: 

echo Hello World && echo GoodBye World

Goodbye Worldは、Hello Worldの後に印刷されます。

0
Rajan Dhanowa