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

* for文の意外な才能 -- コマンドの出力を受取る [#nd8ca94e]

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文一時変数での展開修飾 [#j9e07c2b]

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

| 修飾子  | 例        | 説明 |h
| ~       | %~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 を検索し、&br;%1が最初に見つかったパスの完全修飾名に置換する。&br;環境変数の名前が定義されていない場合、&br;またはファイルが見つからない場合、空文字列に置換する |