• 締切済み

バッチファイル内の各コマンドが順番に実行される条件

Windows環境にてDOSコマンドでバッチファイルを作成して実行します。 バッチファイル内には複数のコマンドを記述しており、上から順番に 処理されて処理が完了してから次のコマンドを実行することを期待しています。 例) ping PC_NAME_A    ping PC_NAME_B 実際に実行してみて1つ目のコマンドが終了してから、2つ目の コマンドが実行されているのは確認できているのですが、 この「1つ目のコマンドが終了してから次のコマンドを実行する」という 仕様を裏付ける記事などが見つけられません。(Microsoftのサイトなど) どなたかご存知の方がいらっしゃいましたら教えてください。

みんなの回答

  • bardfish
  • ベストアンサー率28% (5029/17765)
回答No.6

それはプログラムの書き方で決まります。 例えばping.exeは処理が終了するまで次の入力を受け付けませんが、Windowsのアクセサリにある電卓(calc.exe)は電卓のウィンドウが表示されればコマンドプロンプトは次の入力待ちになります。 プログラムを起動したときにWindowsの新規タスクとして実行した場合とcmd.exeの子プロセスととして実行したという違いです。 一般的なコマンドラインアプリケーションは main() {  ~色々な処理~  exit; } という書き方で、main()関数が終了するまでプロセスを占有します。 マルチタスク(或いはマルチセッション)の場合はセッションIDを新規取得しOSに処理を委託してからプロセスを終了します。 MSDNのセッション管理とかマルチセッション関連の項目を見ればわかるはずです。 ※コマンドラインアプリケーションとWindowsアプリケーションの違いでもOK。

blink-182
質問者

お礼

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

回答No.5

ごめんなさい。 NTカーネル以降はDOS上のコマンドと言えども記述どおりに 処理されないことがあるようです。 OSの仕様です。 A88No8さんの認識が正しいようですね。 不勉強でした失礼いたしました。

blink-182
質問者

お礼

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

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.4

こんにちは  #3の訂正です。  勘違いしてました。心配させてしまってごめんなさいm(__;m  参考URLは、マイクロソフトが技術情報を公開している microsoft technetのURLです。  そこに「バッチ ファイルを使用する」コンテンツがあって、実行順序に関して以下のように書いてありました。 一部引用します。 >コマンド プロンプトでそのファイル名を入力すると、Cmd.exe によってファイルに記述されている順番でコマンドが実行されます。  従って記述されている順番でコマンドは実行されます。  注意すべき点は、ここには「順番で実行されるが先に実行したタスクの終了を待つ」とは一切書かれていないです。  つまり、OSの制限にかからない限り、タスクの終了を待たずに次々に新たなタスクを実行しないとは云っていないことです(リソースが空いている間は、次々に実行できるからマルチタスクですよね)。  私が間違ったのは、実際に先に処理時間のかかるタスクを記述して、次に短い処理時間のタスクを書いたとき、あたかも短いタスクが先に終わるので順番を無視して先に走ったように感じてしまったことでしたm(__)m

参考URL:
http://technet.microsoft.com/ja-jp/library/cc758944(WS.10).aspx
blink-182
質問者

お礼

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

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.3

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

blink-182
質問者

補足

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

回答No.2

そういうものです。って言うんじゃだめなんですね。 処理の順番が規定されていないと、順次処理が 必要なものはバッチで書けなくなるんですが… 一般的な説明でよければですが Wikipediaのバッチ処理を参照してみてください。 ご要望に沿えるかどうかは疑問ですが。

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86
blink-182
質問者

お礼

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

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.1

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

関連するQ&A

  • バッチファイル

    コマンドプロンプトから実行するコマンド 2つを、100回繰り返したいのですが、 バッチファイルで100回繰り返すにはどうしたらよいでしょうか? 単純にForで出来ると思っていたのですが、 dosのバッチファイルのforはちょっと違うみたいで、ほかの言語のように for(){繰り返したい処理} ということが出来ないみたいで、 しかも変数<100というのも出来ない? ようで(INで0 1 2 3・・・のように指定するのですね・・・?) 戸惑っています。 変数を使ってインデントして100で終了させようと思ったのですが、変数も使えない・・・??のですね。(使えるのでしょうか??) そこでWSHで一セット分のコマンドのバッチファイルを作ってWSHからそれを100回呼ぼうかと思ったのですが、いまいち方法がわかりません。 また、wshの中で直接dosコマンドが使えると最もよいのですが・・・。 詳しい方がいましたら教えていただけると幸いです。

  • バッチファイルで実行ファイル同時実行

    こんにちは、 ある複数の実行ファイルを同時に起動させたく思い、 バッチファイルに実行ファイルを羅列したのですが、 調べたところNT系だと終了を待つ様です。 終了を待たずに次のコマンドに進み、実行後コマンドプロンプトを 閉じるまでを行う事は不可能なのでしょうか? よろしくお願いいたします。

  • バッチファイルで実行できたりできなかったり

    こんにちは。 バッチファイルとコマンドプロンプトについて、少々お伺いしたいことがあります。 まず、コマンドプロンプトで以下のコマンドを打ち込んでみたところ、すべて正常に実行することができました。 ping [example.com] > result.txt tracert [example.com] >> tr_result.txt ipconfig /all > ipc_result.txt 次に、各コマンドをテキストファイルに書き込んで、それぞれ "p_test.bat" # 内容は ping コマンド "tr_test.bat" # 内容は tracert コマンド "ipc_test.bat" # 内容は ipconfig コマンド と命名しデスクトップに配置、ダブルクリックで実行してみました。 すると、このうち正常に実行(結果をテキストファイルに出力)されたのは tr_test.bat のみでした。 ここで質問なのですが、なぜこのような違い(バッチファイルにすると実行できるものとできないものに分かれる)が起こるのでしょうか? バッチファイルの作り方やとコマンドプロンプトについて調べてみましたが、説明を見つけることが出来ませんでした。 この辺の理論について詳しい方がおりましたら、ご教示頂きたく思います。 ちなみに、OS は Windows XP SP2 です。 よろしくお願いいたします。

  • バッチファイルからftpを実行時に処理完了を待たない方法

    ある市販のjava系のアプリから時間起動でバッチファイルを起動します そのアプリは同時に複数のバッチファイルを起動できない仕様で ある外部プログラム(バッチファイル)を起動したら処理の完了を 待ってから次の処理バッチファイルを起動するのです 同時起動はできません なので最初に起動したバッチファイルがフリーズしてしまうと 次のバッチファイルが起動できずに永遠と待ち状態になってしまうんです そのソフトのメーカーに問い合わせしてみたのですが 呼び出し側はタイムアウトさせるような設定はない仕様なので 呼び出ししたプログラムのほうでタイムアウトするようにして下さい という回答でした なんとか回避しようと そのバッチファイルは ftp -s:c:\cmd.txt というようにftpコマンドを利用しているのですが (稀に何らかの原因でftpがフリーズしてしまう現象があります) ftpコマンドがフリーズしてしまったらどうしょうもないですよね・・・ この現象を回避したくて バッチファイルを start ftp -s:c:\cmd.txt exit に変更しました こうすればftpの完了を待たずにバッチファイルが終了するので たとえftpの処理が一つフリーズしてしまったとしても 別のバッチファイルの起動は問題なく行えると考えたからです しかしその市販アプリが内部的にどのようにバッチファイルを起動しているかわからないのですがテストしてみましたところ (ftpのコマンドをわざとquitしないようにして終了しないftp処理にして バッチファイルを起動してみたのです) 結果としては起動したバッチファイルが完了したとはみなしてくれず 次のバッチファイル起動ができないまま永遠に待ち状態になってしまいました・・・ バッチファイルからftpコマンドを別プロセスで起動する (ftpの完了を待たずにバッチファイルを終了させる) という事はできないでしょうか? アドバイスお願い致します

  • コマンドプロンプトのバッチファイル実行までの速度

    コマンドプロンプトのバッチファイルを作成したのですが このバッチファイルの実行するまでの処理速度を、コマンドプロンプト上に表示させたいのですが、どのようなコマンドを組めばよいのでしょうか? ちなみにバッチファイルの中身は、 @echo off start http://www.yahoo.co.jp です。よろしくおねがいします。

  • コマンドプロンプトのバッチについて

    WindowsのDOSなどのコマンド処理をするバッチファイルについて ですが、DOSからDB(OracleやSQL Serverなど)を起動させるバッチがあって、DBに入ってからSQLのコマンドなどを自動でさせるバッチって 何か方法はないのでしょうか?? DOS → DB起動後、自動でコマンドで動かしたいです。 細かくいうとWindowsのDOSではなくなるので、 動かなくなると思います。

  • バッチファイルをatコマンドでうまく実行できない

    初心者で申し訳ありませんが教えてください。 特定の時間になると、○○サーバにあるデータをLocalの○○フォルダへコピーするバッチファイルを作成したいと考えています。 コピーだけのバッチファイルは作成できました。 特定の時間になると、このバッチファイルを起動させるバッチファイルを作成したかったので、色々調べていてatコマンドを利用する方法と、 システムツールのタスクを利用する方法を見つけました。 タスクの方だと上手く実行できるのですが、atコマンドのほうが上手くいきません。 記述したコードは以下になります。 at 15:30 C:\Copy.bat タスクには追加されるのですが、実行時間になり、実行中となっても完了しません。 ○○サーバがアクセス権が必要なサーバです。 やはりアクセス権の関係で失敗してるのでしょうか? (でもそれなら、コピーだけのバッチファイルも実行できない気がしますが・・・) タスク処理で設定した方は、設定項目にユーザIDとパスワードを 入力する項目があったので設定してました。 at関数の方も実行するユーザーIDとパスワードを設定すればいいのでしょうか?その場合やり方も教えてください。 よろしくお願いします。

  • バッチファイルであるアプリケーションを起動してからコマンドを実行したい

    バッチファイルで、あるアプリケーションを起動した後にコマンドを走らせたいと考えています。 普通にアプリケーションの起動と実行コマンドを並べて書き込むとアプリケーションを終了させた時点でコマンドが実行されてしまいます。 そのアプリケーションを立ち上げた状態でないと働かないコマンドなので困っています。 何か良い策があればお願いします。

  • VBScript(WScript)のバッチファイル実行

    お世話になります。 VBScriptで困っています。 ご存知の方、ご教示願えますでしょうか。 Windowsでバッチファイルを実行したときに、DOS画面(コマンドプロンプト)が一瞬パッて表示されるかと思います。 現在開発中のシステムで、プログラムからバッチファイルを自動で実行する処理を入れております。 通常ならばバッチファイルを実行した場合、DOS画面が表示されてしまいますが DOS画面を出さないようにプログラムを組んでいます。 つまり、VBScriptからバッチファイルを実行しております。 以下、VBScriptのソースを記載します。 Set objShell = WScript.CreateObject("WScript.Shell") fcresult = objShell.Run("C:\abc.bat", 0, True) wscript.quit fcresult 上記のVBSを実行すると、必然的に「abc.bat」が実行されます。 しかし、現在僕が使っている環境ですとDOS画面が表示されません(←これがやりたいこと) しかし、お客さんの環境で同じ様にVBSからバッチファイルを実行すると 「C:\WINDOWS\System32\CScript.exe」という名前でDOS画面が起動されてしまいます。 周りの環境でもVBSからバッチをたたくような処理を行ってみましたが、DOS画面が起動されず。。。 正直、再現が難しいため大変困っております。 お客さんの環境では100%再現されます。 全くもって原因がつかめておりません。 Windowsのセキュリティの設定でしょうか!? ご存知の方いらっしゃいましたら、知恵をお貸しください。 よろしくお願いいたします。

  • 順番にPINGを飛ばすバッチ

    セグメント内で使用されているIPアドレスを調べるために順番にPINGを飛ばす下記のバッチを作りました。 ----------------------------------------------------- @echo off for /l %%A in (1,1,254) do (ping -n 1 192.168.1.%%A) :EOF ----------------------------------------------------- 実行すると最初の数回は正常に動作したのですが、そのうちうまく実行できなくなりました。 実行するとDOS窓が一瞬開いて、すぐに終了してしまいます。(変数を変更してみても同じです。) 内容をいじっって何回か実行していると、たまに正常動作するのですが・・・。 原因と対処法が分かる方がいらっしゃったら、教えてください。 よろしくお願い致します。