Windowsバッチファイルコマンドを非同期で実行する


187

言うなら、

  • foo.exe
  • bar.exe
  • baz.exe

すべてをバッチファイルから非同期に、つまり前のプログラムの停止を待たずに実行するにはどうすればよいですか?

回答:


254

STARTコマンドを使用して各プログラムを実行すると、必要なものが得られます。

START "title" [/D path] [options] "command" [parameters]

すべてのSTART呼び出しは、/WAITスイッチで実行されない限り、パラメーターで指定されたコマンドを実行し、すぐに戻ります。

これはコマンドラインアプリに適用されます。コマンドラインのないアプリはとにかくすぐに戻るので、すべてを非同期で実行したい場合は、を使用してくださいSTART


わかりました、ありがとう。の各エントリをhelp注意深く読んでいるべきでした。:)
RichN

8
先日実際にこれで問題がありました。パフォーマンステストのために30個のエクスプローラウィンドウを起動する必要がありました。うまくいかなかったし、それを調べるのに十分重要ではなかった。代わりにそのウィンドウでブラウジングを開始し、数時間後に閉じたところ、別のウィンドウがポップアップした。そして、私は地獄のようなものでした、それを閉じました..別がポップアップしました!4〜5個のウィンドウと多くの****の後、バッチファイルがまだ実行されていることに気付きました!
ジョナスB

3
恥知らずな自己宣伝:私は一度だけのプロセスのために、スレッドプールのいくつかの種類として機能することができるバッチを作成しました:stackoverflow.com/questions/672719/...
ジョーイ

4
引数を指定する必要がある場合、またはコマンドへのパスにスペースが含まれている場合は、引用符を追加してください。この場合、コンソールウィンドウを開くときにもタイトルを指定する必要があります。start "" "[path to command]" [command args]
Pierluigi

それが行われたときにこのテクニックで伝える方法はありますか?私はFILA DESTAのコピーを30枚ほど始めます。非同期にしたいのですが、すべてが完了したときに何らかのアイデアが欲しいです。
Doug

68

上記の回答のいくつかを組み合わせて、を試すことができますstart /b cmd /c foo.exe

簡単な例として、java / groovy / grails / gradleのバージョンを印刷したい場合は、バッチファイルで次のように実行できます。

@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version

プロセスエクスプローラー(Sysinternals)のようなものがある場合は、いくつかの子cmd.exeプロセス(それぞれ上記のコマンドに従って)がjavaプロセスで表示されます。出力は、終了する順序に関係なく画面に出力されます。

start /b :  Start application without creating a new window. The
             application has ^C handling ignored. Unless the application
             enables ^C processing, ^Break is the only way to interrupt
             the application

cmd /c : Carries out the command specified by string and then terminates

13
コマンドがコンソールにエコーされるのを防ぎます。バッチスクリプトecho offでは、最初に、スクリプトを実行すると、すべてのコマンドがコンソールにエコーされないようにすることがあります。@似ているが、ちょうどその単一のコマンドです。したがって、時々表示され@echo offます。
djKianoosh 2016

36

startコマンドを使用して、新しいウィンドウを起動せずにバックグラウンドプロセスを生成できます。

start /b foo.exe

新しいプロセスはCTRL-Cで中断できません。CTRL-BREAKでのみ(またはウィンドウを閉じるか、タスクマネージャ経由で)強制終了できます。


5
BREAK最近キーボードはどこにありますか?
user2023370

1
@ user2023370 Pauseキーのままです。特定のキーがないほとんどのラップトップは、非表示のキーの組み合わせをサポートしています
Gerold Broser、2016年


23

次の行を含むバッチファイルを作成します。

start foo.exe
start bar.exe
start baz.exe 

startコマンドは、すべての3つのコマンドは非同期で実行しますので、新しいウィンドウでコマンドを実行します。


17

STARTコマンドを使用します。

start [programPath]

プログラムへのパスにスペースが含まれている場合は、引用符を追加してください。この場合、開始コンソールウィンドウのタイトルも指定する必要があります。

start "[title]" "[program path]"

引数を提供する必要がある場合は、最後に(コマンドの引用符の外で)引数を追加します。

start "[title]" "[program path]" [list of command args]

/ bオプションを使用して、新しいコンソールウィンドウを開かないようにします(ただし、その場合、CTRL-Cを使用してアプリケーションを中断することはできません。


10

3つ目の(そして場合によってははるかに簡単な)オプションがあります。単一のプログラムの複数のインスタンスを起動したい場合、XargsやGNU ParallelなどのUnixスタイルのコマンドプロセッサを使用すると、かなり簡単なプロセスになります。

これをかなり簡単にするPPX2と呼ばれるwin32 Xargsクローンがあります。

たとえば、ビデオファイルのディレクトリをトランスコードする場合は、次のコマンドを実行できます。

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"

これを分けて、dir /b *.mpg現在のディレクトリにある.mpgファイルのリストを取得すると、|オペレーターはこのリストをppx2にパイプし、並列に実行される一連のコマンドを作成します。-P 4オペレーターがここで指定したとおり、一度に4つ。-L 1オペレータは一度にffmpegのに列挙たちのディレクトリの1行を送信するためにppx2に指示します。

その後、コマンドライン(ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4")を記述するだけ{}で、ディレクトリリストの各行が自動的に置き換えられます。

すべてのケースに適用できるわけではありませんが、上記の回避策を使用するよりもはるかに簡単です。もちろん、ファイルのリストを扱っていない場合は、テキストファイルやその他のプログラムの内容をpxx2の入力にパイプすることもできます。


1
最新のxargs win32ポートは、最近はうまく機能します(とにかくgit for windowsに含まれているもの)。
Peter M

Unicode文字を含むファイルの処理に失敗することを除いて、これは素晴らしいことです。Unicodeファイルをサポートする計画はありますか?ありがとう。
グーカンSeverの

@GökhanSever過去に、C:\ PROGRA〜1 \ WINDOW〜3 \ MYPROG〜1.EXEのようなパスの「短縮名」形式を使用してこの問題を回避しました。きれいではありませんが、動作します。
Meltform 2017年

-1

powershellを使用してbatスクリプトを開始しただけで、結局何も動作しませんでした..場合によってはcmd / cも起動しない場合がある理由がわからない.. cmd / cメモ帳を開始して終了する

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.