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

例) ping PC_NAME_A
   ping PC_NAME_B

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

このQ&Aに関連する最新のQ&A

A 回答 (6件)

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



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

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

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

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

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

お礼日時:2010/02/25 19:18

ごめんなさい。



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

A88No8さんの認識が正しいようですね。
不勉強でした失礼いたしました。
    • good
    • 1
この回答へのお礼

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

お礼日時:2010/02/25 19:19

こんにちは


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

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

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

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

参考URL:http://technet.microsoft.com/ja-jp/library/cc758 …(WS.10).aspx
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/25 19:19

こんにちは


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

この回答への補足

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

補足日時:2010/02/24 16:16
    • good
    • 0

そういうものです。

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

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

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

参考URL:http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83% …
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/24 16:20

こんにちは


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

start /wait ping PC_NAME_A
start /wait ping PC_NAME_B
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

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

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

このQ&Aと関連する良く見られている質問

Qコマンドプロンプトでバッチファイルを実行とは

素人ですが、「コマンドプロンプトでバッチファイルを実行」というのはどうやってやるものですか。

#簡単なサンプルを教えていただきたいのですが。

Aベストアンサー

Windows用語のコマンドプロンプトとは
分類上はコマンドラインインターフェイス(CLI)で
他のOSでは、コンソールと呼ばれることが多い。
ターミナルといった呼び方をする場合もある。

総じて、キーボード入力のコマンドと
上へスクロールアウトしていく文字列で全てがまかなわれる。

正確には、コマンドプロンプトというのは
このコマンドラインインターフェイスにおいて
コマンドの入力を促すために表示されている文字列と記号を指します。
ほぼすべてのOSで普遍的にコマンドプロンプトはそれしか意味しません。

が、Windowsでは、用語の混乱がひどいので
MS-DOS互換コンソールのことをコマンドプロンプトと呼びます。
DOS窓とか、「コマンドラインで」とかいった表現も使います。

バッチファイルは、通常MS-DOSやWindowsにおいて
バッチ処理
(複数のコマンドをひとまとめにした処理)
を行うためのファイルで、拡張子はBATになっています。
中身は、単にコマンドが書き並べられています。

バッチファイルのアイコンをクリックしても起動できますが
バッチファイルでは、処理内容としてドライブや
ディレクトリー,ファイル等を明示的に指定することが多く
また、実行開始する場所からの相対指定が多用されます。

バッチファイルは想定されたディレクトリーで実行しなければ
誤動作したり、事故を起こす可能性も高いと思うべきです。
エラー処理に手間をかけるような事例であれば
最初からバッチファイルで用意したりしないでしょう。

絶対指定と相対指定というウェブにもある概念の理解と
カレントディレクトリーにかかわる位置感覚を身に着けることが
コマンドライン操作の鍵と言えます。

Windows用語のコマンドプロンプトとは
分類上はコマンドラインインターフェイス(CLI)で
他のOSでは、コンソールと呼ばれることが多い。
ターミナルといった呼び方をする場合もある。

総じて、キーボード入力のコマンドと
上へスクロールアウトしていく文字列で全てがまかなわれる。

正確には、コマンドプロンプトというのは
このコマンドラインインターフェイスにおいて
コマンドの入力を促すために表示されている文字列と記号を指します。
ほぼすべてのOSで普遍的にコマンドプロンプトはそれしか意...続きを読む

Q起動時DRIVER_IRQL_NOT_LESS_OREQUAL(Smb_driver_sys)

先日ウインドウズ7から10にアップデートした時から起動時ブルーバックでこのメッセージが出るようになりました
対処法がわからず困っています。メッセージをなくす方法教えてください、よろしくお願いします。

Aベストアンサー

OSは違うかもしれませんが、同様のエラーメッセージに対して先日回答しています。
かなり残念な内容ですが、ご参考になれば。
https://oshiete.goo.ne.jp/qa/9067332.html

Qroot権限の実行コマンドを通常ユーザーで実行

root権限に限らないのですが、他のユーザーの権限でしか実行できないコマンドを自分で実行する方法が知りたいのです。
と言っても、rootや他ユーザーのパスワードを知っているという前提です。

例えば、通常ユーザーで作業をしているときに、root権限で行う必要のあるコマンドを実行したいとします。
今は、suでログインしてから実行していますが、shellスクリプトで実行したいと思っています。

どういったshellスクリプトになりますでしょうか?

Aベストアンサー

> 今回やろうと思ってるのは、suでログインしてから、いくつかの操作を行いたいので

であれば、そのいくつかの操作をまとめてシェルスクリプトにして、
それを su の -c に渡せば良いですね。

例えば、rally というユーザで、シェルスクリプト名が do_rally.sh とします。
スクリプトに実行権限がついていなければ

% su - rally -c "sh do_rally.sh"

という感じ。実行権限がついていれば

% su - rally -c do_rally.sh

で良いです。

ただ、最低一回はパスワードの入力があるので、su を使っている限りは
それからは逃れられません。

# ちょっと遅くなったので、もう sudo を使っているかな?

Qkillコマンドの終了と強制終了の違いについて

私は、SUNのSolaris8を使っています。

現在動いているプロセスを、killコマンドを使って終了させる際に、
-9または-KILLオプションを付けると、強制終了を行いますよね。

そこで質問なのですが、そもそもプロセスの『終了』と『強制終了』の違いとは何ですか?

とっても初歩的な質問だとは思いますが、いまいち理解できません。
よろしくお願いします。

Aベストアンサー

いわゆる unix には、「シグナル」というイベント通知の仕組みがあります。

あるプロセスに対して、シグナルが送信されると、そのプロセスは、やっている
処理を中断して、シグナルハンドラという特別に割り当てられた処理を行います。

kill コマンドというのは、このシグナルの送信をするコマンドに他なりません。


シグナルは、番号でイベントを区別でき、何種類もあり、それぞれの番号毎に
意味が割り当てられています。

シグナルハンドラは、自分で作って登録することもできますが、その登録を行わない
ときには、それぞれのシグナルに「デフォルトの動作」が割り当てられています。

デフォルトの動作は、無視・コア・終了・停止の4種類あります。

シグナルの中で9(SIGKILL)だけは、ちょっと特別で、シグナルハンドラの登録が
無視されます。なので、このシグナルを送信することで、対象のプロセスを無条件に
終了させることが保証されています。

これを簡単に言うと「強制終了」ですね。

他にも、デフォルトの動作が「終了」シグナルがあります(例えば、1や2)。
こいつらも送信すると対象のプロセスは終了するのですが、シグナルハンドラを
登録することができるので、そのプロセスの作り方によっては終了しないことが
ありえます。


> そもそもプロセスの『終了』と『強制終了』の違いとは何ですか?

普通にプロセスが終了する場合、というのは exit システムコールを呼んだのと
同じなんですが、シグナルのデフォルトの動作での「終了」も exit システムコール
を呼ぶのと同じです。

なので、実は違いがありません。

kill -KILL は、「『終了』を無条件に例外無く行う」と考えて下さい。

いわゆる unix には、「シグナル」というイベント通知の仕組みがあります。

あるプロセスに対して、シグナルが送信されると、そのプロセスは、やっている
処理を中断して、シグナルハンドラという特別に割り当てられた処理を行います。

kill コマンドというのは、このシグナルの送信をするコマンドに他なりません。


シグナルは、番号でイベントを区別でき、何種類もあり、それぞれの番号毎に
意味が割り当てられています。

シグナルハンドラは、自分で作って登録することもできますが、その登録を...続きを読む

Qnamedとnamed-xferの動き方(?)について

上記のWEBを見ながら設定してて、実際にnamedとnamed-xferっていう2つのプログラムをLinuxの中で動かしてみたいんですけど、このnamedとnamed-xferがどんなプログラムでどんな風にどれくらいの時間の感覚で動いているのか全くわかりません。教えてください。

Aベストアンサー

まず,これらのソフトは『BIND』と呼ばれるDNSのソフトパッケージの一部です。

namedはDNSサーバ本体,そのものであり,常時動いています。

named-xferは,前述namedが使う補助的なプログラムです。
namedに呼ばれたときだけ,たまにうごきます。
環境によっては,一生動きません(呼ばれません)。
複数台のDNSサーバ間でDNS情報をやり取りする際(ゾーン転送)に使われるものなので,cwsk2001さんのように『ちょっとnamed動かしてみた』という環境では,named-xferが動くことはありませんよ。プライマリDNS,セカンダリDNSという言葉がありますよね。あれに関連して使われるものです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報