![「start cmd /c」を複数回実行すると、一時停止コマンドが順番どおりに実行されません。](https://rvso.com/image/1592546/%E3%80%8Cstart%20cmd%20%2Fc%E3%80%8D%E3%82%92%E8%A4%87%E6%95%B0%E5%9B%9E%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E4%B8%80%E6%99%82%E5%81%9C%E6%AD%A2%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E9%A0%86%E7%95%AA%E3%81%A9%E3%81%8A%E3%82%8A%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82.png)
次のようなスクリプトがあります:
@start /b cmd /c net stop "Service"
@start /b cmd /c net stop "Service"
@start /b cmd /c net stop "Service"
@start /b cmd /c net stop "Service"
@start /b cmd /c net stop "Service"
pause
ただし、pause
スクリプト内のその上の行がすべて実行される前に、コマンドが実行されます。各サービス (約 100 回) の後に「サービスを停止しています...」を待たなくて済むようにする必要があります。すべてのコマンドが完了するまで待機してから一時停止を実行する@start /b cmd /c
ように cmd に指示する方法はありますか?@start /b cmd /c net stop "Service"
私が何を言っているのかを確認するには、次のバッチ ファイルを実行してください。
@start /b cmd /c echo Hello
@start /b cmd /c echo Hello
@start /b cmd /c echo Hello
@start /b cmd /c echo Hello
@start /b cmd /c echo Hello
@start /b cmd /c echo Hello
pause
Pause
がすべて印刷された後にが発生するのではなくHello
、途中で発生します。
答え1
このコマンドはstart
、現在のコンソールが実行している内容とは別に、独自のコンテキストでアプリケーションを起動します。そのため、現在のターミナルが実行している内容がすべて完了すると、コマンドの実行が完了すると出力が返されます。そのため、このすべての開始コマンドを送信しても、一時停止はすべての処理が完了するのを待つのではなく、プロセスを開始するのに十分な時間待機するだけです。そのため、プロセスpause
の途中で が表示されますが、これは単なるタイミングの問題です。
したがって、問題を解決するには、2 番目のバッチ スクリプトが終了するまで待つ/wait
か、その呼び出しを行うことができます。この方法では、必要に応じて、一部のコマンドを待機し、他のコマンドを待機しないようにすることができます。
スクリプトを待つテクニック
@start /wait /b cmd /c echo Hello
@start /wait /b cmd /c echo Hello
@start /wait /b cmd /c echo Hello
@start /wait /b cmd /c echo Hello
@start /wait /b cmd /c echo Hello
@start /wait /b cmd /c echo Hello
pause
ランチャースクリプトを使ったテクニック
@echo off
title Laucher
:: This scripts don't need to be waited
start /b cmd /c 'script1.bat'
:: This script needs to be waited
start /wait /b cmd /c 'script2.bat'
スクリプト1
@echo off
title Script to run without waiting
SomeProcessThatDoesn'tNeedsToBeWaited
スクリプト2
@echo off
title Script to run to be waited
SomeProcessThatNeedsToBeWaited
乾杯