Windoze/CmdExe

Last-modified: 2007-12-25 (火) 10:11:04

Win32コマンドプロセッサ(cmd.exe)関連の話題。

for文の意外な才能 -- コマンドの出力を受取る

Unixシェルだと(大体どんなシェルでも)次のようにコマンド行をバッククォートで括ることでコマンドの出力をシェル変数に取り込めるが

$ momo=`external command and args`

cmd.exeでも似たようなことができる。ただし本来リスト要素の反復処理構文であるforを使うところが面白い。

C:\> for /f "usebackq" %a in (`some command and args`) do another command and args

/fスイッチは、ファイルのフィルタ処理をさせるもののようだ。()で括られたファイル名のリストから各各のファイルが開かれ、各行が読取られて一時変数(上の例では%a)に格納され、do節が実行される、というのが本来の振舞い。

ここで、リスト内の要素を文字列とすることもできる。二重引用符で括ればそのまま文字列として扱われ、単引用符で括ると、コマンドと解釈されてその実行結果が入る。usebackqオプションを使うと、文字列の場合は単引用符、コマンドの場合は逆引用符(バッククォート)で括る。

バッチパラメータやfor文一時変数での展開修飾

バッチパラメータ(%0~%9)、for一時変数(%a~%Z)、環境変数(%変数名%)がファイル名を指している場合、以下の修飾子をつけて評価結果を変えることができる。

修飾子説明
~%~1%1 を展開し、囲んでいる二重引用符 ("") がある場合は削除する
~f%~1%1 を完全修飾パス名に置換する
~d%~1%1 のドライブ文字を取出す
~p%~1%1 のパスを取出す
~n%~1%1 のファイル名を取出す
~x%~1%1 の拡張子を取出す
~s%~1%1 のファイル名を短縮名に置換する
~a%~1%1 のファイル属性を取出す
~t%~1%1 のファイルの日付と時刻を取出す
~z%~1%1 のファイルサイズを取出す
~$PATH:%~$PATH:1環境変数 PATH を検索し、
%1が最初に見つかったパスの完全修飾名に置換する。
環境変数の名前が定義されていない場合、
またはファイルが見つからない場合、空文字列に置換する