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が最初に見つかったパスの完全修飾名に置換する。 環境変数の名前が定義されていない場合、 またはファイルが見つからない場合、空文字列に置換する |