質問

Windows環境にてDOSコマンドでバッチファイルを作成して実行します。
バッチファイル内には複数のコマンドを記述しており、上から順番に
処理されて処理が完了してから次のコマンドを実行することを期待しています。

例) ping PC_NAME_A
   ping PC_NAME_B

実際に実行してみて1つ目のコマンドが終了してから、2つ目の
コマンドが実行されているのは確認できているのですが、
この「1つ目のコマンドが終了してから次のコマンドを実行する」という
仕様を裏付ける記事などが見つけられません。(Microsoftのサイトなど)
どなたかご存知の方がいらっしゃいましたら教えてください。

通報する

回答 (6件)

それはプログラムの書き方で決まります。

例えばping.exeは処理が終了するまで次の入力を受け付けませんが、Windowsのアクセサリにある電卓(calc.exe)は電卓のウィンドウが表示されればコマンドプロンプトは次の入力待ちになります。

プログラムを起動したときにWindowsの新規タスクとして実行した場合とcmd.exeの子プロセスととして実行したという違いです。

一般的なコマンドラインアプリケーションは
main() {
 ~色々な処理~
 exit;
}
という書き方で、main()関数が終了するまでプロセスを占有します。
マルチタスク(或いはマルチセッション)の場合はセッションIDを新規取得しOSに処理を委託してからプロセスを終了します。

MSDNのセッション管理とかマルチセッション関連の項目を見ればわかるはずです。
※コマンドラインアプリケーションとWindowsアプリケーションの違いでもOK。

この回答へのお礼

ご回答ありがとうございます。
結局、これだという情報に辿り着けませんでしたがstart /waitコマンドにて処理完了を制御することで一応落ち着きました。
いろいろとバッチを作ってみましたが、先に実行している処理が完了してから次の処理が呼ばれているようです。

ごめんなさい。

NTカーネル以降はDOS上のコマンドと言えども記述どおりに
処理されないことがあるようです。
OSの仕様です。

A88No8さんの認識が正しいようですね。
不勉強でした失礼いたしました。

この回答へのお礼

ご回答ありがとうございます。
結局、これだという情報に辿り着けませんでしたがstart /waitコマンドにて処理完了を制御することで一応落ち着きました。
いろいろとバッチを作ってみましたが、先に実行している処理が完了してから次の処理が呼ばれているようです。

こんにちは
 #3の訂正です。
 勘違いしてました。心配させてしまってごめんなさいm(__;m
 参考URLは、マイクロソフトが技術情報を公開している microsoft technetのURLです。
 そこに「バッチ ファイルを使用する」コンテンツがあって、実行順序に関して以下のように書いてありました。 一部引用します。

>コマンド プロンプトでそのファイル名を入力すると、Cmd.exe によってファイルに記述されている順番でコマンドが実行されます。

 従って記述されている順番でコマンドは実行されます。
 注意すべき点は、ここには「順番で実行されるが先に実行したタスクの終了を待つ」とは一切書かれていないです。
 つまり、OSの制限にかからない限り、タスクの終了を待たずに次々に新たなタスクを実行しないとは云っていないことです(リソースが空いている間は、次々に実行できるからマルチタスクですよね)。

 私が間違ったのは、実際に先に処理時間のかかるタスクを記述して、次に短い処理時間のタスクを書いたとき、あたかも短いタスクが先に終わるので順番を無視して先に走ったように感じてしまったことでしたm(__)m

この回答へのお礼

ご回答ありがとうございます。
結局、これだという情報に辿り着けませんでしたがstart /waitコマンドにて処理完了を制御することで一応落ち着きました。
いろいろとバッチを作ってみましたが、先に実行している処理が完了してから次の処理が呼ばれているようです。

こんにちは
#1の訂正です。
>マルチタスクOSでは、実行順序は保証されません。
Windows 95以降のWindowsの BATコマンドでは書かれた実行順序は保証されません。

この回答への補足

回答ありがとうございます。
順序が保障される、されないのどちらの場合でも裏付けとなる情報が
欲しいのです・・・
実行順序が保障されなければそれはそれでA88No8さんのおっしゃる通り
start /wait で対応になるのかとは思っています。

そういうものです。って言うんじゃだめなんですね。
処理の順番が規定されていないと、順次処理が
必要なものはバッチで書けなくなるんですが…

一般的な説明でよければですが
Wikipediaのバッチ処理を参照してみてください。

ご要望に沿えるかどうかは疑問ですが。

この回答へのお礼

回答ありがとうございます。
改めて勉強になりました。

こんにちは
 マルチタスクOSでは、実行順序は保証されません。
 実行順序を確保するときは、start コマンドの引数としてコマンドを指定します。

start /wait ping PC_NAME_A
start /wait ping PC_NAME_B

このQ&Aは役に立ちましたか?2 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

このQ&Aを見た人はこんなQ&Aも見ています

注目の記事

おしトピにAndroid版アプリが登場

話題のトピックにさくっとコメントできる「おしトピ」に Android版アプリが登場! もっと身近に使いやすくなりました。

このQ&Aを見た人が検索しているワード


新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ

べんりQ&A特集