web-dev-qa-db-ja.com

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

私が持っているなら

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

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

171
RichN

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

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

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

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

233
macbirdie

これまでの回答をいくつか組み合わせて、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
62
djKianoosh

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

start /b foo.exe

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

35
sproaticus

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

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

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

21
Nikhil

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

start [programPath]

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

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

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

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

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

16
Pierluigi

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演算子は、ディレクトリ一覧の1行のみを一度にffmpegに送信するようにppx2に指示します。

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

これはすべての場合に普遍的に適用できるわけではありませんが、上記のバッチファイルの回避策を使用するよりもはるかに簡単です。もちろん、ファイルのリストを処理していない場合は、テキストファイルまたはその他のプログラムの内容をpxx2の入力にパイプすることもできます。

10
schmod