- 締切済み
バッチファイル内の各コマンドが順番に実行される条件
Windows環境にてDOSコマンドでバッチファイルを作成して実行します。 バッチファイル内には複数のコマンドを記述しており、上から順番に 処理されて処理が完了してから次のコマンドを実行することを期待しています。 例) ping PC_NAME_A ping PC_NAME_B 実際に実行してみて1つ目のコマンドが終了してから、2つ目の コマンドが実行されているのは確認できているのですが、 この「1つ目のコマンドが終了してから次のコマンドを実行する」という 仕様を裏付ける記事などが見つけられません。(Microsoftのサイトなど) どなたかご存知の方がいらっしゃいましたら教えてください。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- bardfish
- ベストアンサー率28% (5029/17766)
それはプログラムの書き方で決まります。 例えばping.exeは処理が終了するまで次の入力を受け付けませんが、Windowsのアクセサリにある電卓(calc.exe)は電卓のウィンドウが表示されればコマンドプロンプトは次の入力待ちになります。 プログラムを起動したときにWindowsの新規タスクとして実行した場合とcmd.exeの子プロセスととして実行したという違いです。 一般的なコマンドラインアプリケーションは main() { ~色々な処理~ exit; } という書き方で、main()関数が終了するまでプロセスを占有します。 マルチタスク(或いはマルチセッション)の場合はセッションIDを新規取得しOSに処理を委託してからプロセスを終了します。 MSDNのセッション管理とかマルチセッション関連の項目を見ればわかるはずです。 ※コマンドラインアプリケーションとWindowsアプリケーションの違いでもOK。
- number1185
- ベストアンサー率22% (19/85)
ごめんなさい。 NTカーネル以降はDOS上のコマンドと言えども記述どおりに 処理されないことがあるようです。 OSの仕様です。 A88No8さんの認識が正しいようですね。 不勉強でした失礼いたしました。
お礼
ご回答ありがとうございます。 結局、これだという情報に辿り着けませんでしたがstart /waitコマンドにて処理完了を制御することで一応落ち着きました。 いろいろとバッチを作ってみましたが、先に実行している処理が完了してから次の処理が呼ばれているようです。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは #3の訂正です。 勘違いしてました。心配させてしまってごめんなさいm(__;m 参考URLは、マイクロソフトが技術情報を公開している microsoft technetのURLです。 そこに「バッチ ファイルを使用する」コンテンツがあって、実行順序に関して以下のように書いてありました。 一部引用します。 >コマンド プロンプトでそのファイル名を入力すると、Cmd.exe によってファイルに記述されている順番でコマンドが実行されます。 従って記述されている順番でコマンドは実行されます。 注意すべき点は、ここには「順番で実行されるが先に実行したタスクの終了を待つ」とは一切書かれていないです。 つまり、OSの制限にかからない限り、タスクの終了を待たずに次々に新たなタスクを実行しないとは云っていないことです(リソースが空いている間は、次々に実行できるからマルチタスクですよね)。 私が間違ったのは、実際に先に処理時間のかかるタスクを記述して、次に短い処理時間のタスクを書いたとき、あたかも短いタスクが先に終わるので順番を無視して先に走ったように感じてしまったことでしたm(__)m
お礼
ご回答ありがとうございます。 結局、これだという情報に辿り着けませんでしたがstart /waitコマンドにて処理完了を制御することで一応落ち着きました。 いろいろとバッチを作ってみましたが、先に実行している処理が完了してから次の処理が呼ばれているようです。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは #1の訂正です。 >マルチタスクOSでは、実行順序は保証されません。 Windows 95以降のWindowsの BATコマンドでは書かれた実行順序は保証されません。
補足
回答ありがとうございます。 順序が保障される、されないのどちらの場合でも裏付けとなる情報が 欲しいのです・・・ 実行順序が保障されなければそれはそれでA88No8さんのおっしゃる通り start /wait で対応になるのかとは思っています。
- number1185
- ベストアンサー率22% (19/85)
そういうものです。って言うんじゃだめなんですね。 処理の順番が規定されていないと、順次処理が 必要なものはバッチで書けなくなるんですが… 一般的な説明でよければですが Wikipediaのバッチ処理を参照してみてください。 ご要望に沿えるかどうかは疑問ですが。
お礼
回答ありがとうございます。 改めて勉強になりました。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは マルチタスクOSでは、実行順序は保証されません。 実行順序を確保するときは、start コマンドの引数としてコマンドを指定します。 start /wait ping PC_NAME_A start /wait ping PC_NAME_B
お礼
ご回答ありがとうございます。 結局、これだという情報に辿り着けませんでしたがstart /waitコマンドにて処理完了を制御することで一応落ち着きました。 いろいろとバッチを作ってみましたが、先に実行している処理が完了してから次の処理が呼ばれているようです。