«前の日記(2010-03-28) 最新 次の日記(2010-04-04)» 編集

KONO's Diary-休むに似たり



2010-04-02 [長年日記]

_ [pc] Windowsのコマンドラインとバッチ

ちょっと専門的な話だけど、仕事でプログラマもやっているくせに今まで気づいていなくて、どうしても書きたいのでお付き合い願いたい。

Windowsのコマンドプロンプトを開いて、

sol

と入力して[Enter]を押すと、ソリティアが起動する。

このときコマンドプロンプトは、カーソルが次の行に移って「次のコマンドが打てる状態」になっている。

試しに続けて

sol
と入力して[Enter]を押すともう一つソリティアが起動するし、
winmine
と入力して[Enter]を押すとマインスイーパが起動する。

最初に起動したソリティアのウィンドウは、(ソリティアに対して何もしていないので)まだスクリーンの上にいる。後から起動したソリティアやマインスイーパの陰に隠れているかもしれないが、少なくともプログラムは終了していない。

ここで、テキストエディタを開いて、一行目に"sol"、二行目も"sol"、三行目に"winmine"と入力し、hoge.batとか何か適当な名前のバッチファイルとして保存する。 保存したら、コマンドプロンプトから

hoge.bat

と入力して、このバッチを実行してみる。

すると、一行目の"sol"を実行したところでバッチは待っている。

画面に開いたソリティアのウィンドウを閉じない限り、二行目の"sol"は実行されない。

こんな風に、同じコマンド・プログラムでも「コマンドプロンプトから直接入力した場合」と「バッチファイルで実行した場合」でコマンドのインターフェースが異なる、というのは、知らなかった。

無論、バッチファイルを実行する時は、このように1行のコマンドが終わるまで、次のコマンドの実行は待ってくれる方がありがたい…というか、それが必須になる。

実は、某社のETLツールでデータ変換のテストをするのに、コマンドプロンプトから直接変換コマンドを実行したら、そこそこ大量のデータがあるハズなのに一瞬で制御が戻ってきたので不審に思って調べてみたら、制御が戻ったあと数秒してからデータが出力されていることが判って、ちょっと慌てたのだった。

バッチファイルの中で同様の挙動をされたら、データ変換が完了する前に次のコマンド--出力したデータをRDBに格納するコマンド--が動いてしまい、RDBの中身が尻切れトンボ状態になってしまう可能性があるからである。 しかしバッチファイルをテストしたらそんな現象は全然起こらなくて、よくよく調べたらWindowsのコマンドプロンプトはもともと上記のような性質を持っていた、という次第である。

しかしこの性質は今まで全然気付かなかったなぁ…。

sol.exe実行の図
[]



あわせて読みたい rss
«前の日記(2010-03-28) 最新 次の日記(2010-04-04)» 編集
カバー画像はWikimedia Commonsより。
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
画像提供元:http://commons.wikimedia.org/wiki/Image:Field_of_hay_bales_-_omeo.jpg