forの制御変数に使える文字

for /? を見ると、A-Z a-z の合計52個のようだが、実際には % , ; = 以外のほとんどの 記号が使えるようである。ただし、特殊文字については ^ によるクォートが必要。

for %%^" in (1 2 3) do echo %%^"

また、tokens= 指定による追加の変数もASCIIコード順に割り当てられる。

for /f "tokens=1-3" %%Z in ("A B C") do echo %%Z %%[ %%\

カッコ内のでの改行や区切り

in 部のカッコ内においても、区切りのところで ^ を書かずとも改行できる。

for %%I in (A B C D E F G H I J K L M
            N O P Q R S T U V W X Y Z
) do echo %%I

改行は空白と同じに見なされる様だ。

for /f "delims=" %%A in ('echo
aaaa
bbbb
cccc
') do echo %%A    → aaaa bbbb cccc を表示

また、要素の区切りには空白のほか、= ; , も使用できる。

for %%I in (A=B;C,D) do echo %%I               → A B C D を順に表示

従って、in 部の (' ') や (` `) 内でこれらの文字を使う必要があるときは ^ によるクォートが必要。
( ) 内では、^ をつけても駄目である。
(" ") では " " が = 等もクォートするので文字単位でのクォートは不要。 言い換えると = ; , は区切り記号にならない。

for /f "delims=" %%A in ('echo =') do echo %%A → ECHO は <ON> です。を表示
for /f %%A in ('echo ^=') do echo %%A          → = を表示
for %%A in (A ^= ^; ^,) do echo %%A            → A のみ表示
for /f %%A in ("A=;,B") do echo %%A            → A=;,B を表示

区切り記号ではないが、( ) (' ') (` `) 内で ) を使うときもクォートが必要である。

for /f でスキップされる行

for /f でテキストファイルから読んだり、コマンド実行結果を処理したりする際、 空行はスキップされる*1

ただし正確には空行をスキップするのでなく、for制御変数が空の場合にスキップされる。 例えば "tokens=2" と指定した場合、空行でなくても2番目のトークンが無い場合、 つまり、空白で区切られた語が1つしか無い行もスキップされる。 下記のように文字列指定の場合も同様。

set N=0
for /f "tokens=3" %%A in ("a b") do set /a N+=1
echo %N%      → 0 が表示される 
for /f "tokens=2" %%A in ("a b") do set /a N+=1
echo %N%      → 1 が表示される 

tokens= で複数のトークンを指定した場合、追加の変数は該当トークンが無い場合は 空になる。最初のトークンが空で無い限り、行は処理される。

オプションは " " で囲まなくても良い

for /? を見ると、オプション指定時は " " で囲むように書いてあるが実際は 囲まなくても良い。

for /f usebackq %%A in (`time/t`) do echo %%A

ただし、= , ; は、for 文の構文解析において空白と見なされるので、これらを 使うときは、個別に ^ でクォートするか、全体を " " で囲んでクォートする。
下記はどちらも同じ動作をする。

for /f tokens^=1^,2^ delims^=: %%A in ('time/t') do set H=%%A&set M=%%B
for /f "tokens=1,2 delims=:" %%A in ('time/t') do set H=%%A&set M=%%B

"delims=" と "tokens=*"

読み取った文字列を分割しない場合、for /f "delims=" と for /f "tokens=*" の 2通りの方法がある。前者は区切り文字無しを指定、後者は区切り文字はデフォルトだが 全てのトークンを得るという違いがある。具体的には、前者では文字列そのままが 得られ、後者では先頭の空白文字が削除されて得られるという違いになる。
普通は、"delims=" の方が良いだろう。

delims= に空白を含める

デリミタのデフォルト値は空白とタブである。デリミタをカンマと空白にしたいとき、 "delims=, "と指定するが、tokens= 等の他のパラメータがある場合、delims= は 最後のパラメータとして指定し、パラメータを閉じる " の前に空白を置くことで デリミタに空白を含めることが出来る。最後に置かないと空白は他のパラメータとの 区切りとみなされてしまい、デリミタの一部とはならない。
カンマと空白とタブを指定したい時は、タブコードを空白より前に追加すれば良い。

usebackq の使い時

for /f 構文の in ( ) 部の書式は、usebackq オプションの有無によって2通りの パターンがある。どういうケースの時に usebackq を指定すべきか。

ファイルセットの場合
空白を含んだファイル名のときは、" " で囲む必要があるので、その場合及び パラメータなどで空白を含む可能性がある場合は、usebackq の指定が必須である。
文字列指定の場合
特殊文字を個別にクォートする必要がなくなるため、" " で囲んだほうが便利である。 従って、文字列指定の場合は usebackq は指定しないで " " で囲むほうが良い。
コマンド指定の場合
' ' で囲むのも ` ` で囲むのも特に違いは無いのでどちらでも良いが、 コマンド中で ' ' を多用するなどの事情が無い限り usebackq 無しで良いだろう。

eol= のデフォルト値と空にする方法

for /? を見る限り何も言及が無いので、eolパラメータのデフォルト値は空のように 思えるが、実際は ; (セミコロン)である。しかも簡単に空にすることは出来ない。

for /f "eol= delims=" → 空白がeol文字となって空白で始まる行がスキップされる
for /f "delims= eol=" → " がeol文字となって " で始まる行がスキップされる

delims が空でないときはそれと同じ文字を eol 文字に指定することで、eol 機能を 無効に出来る。delims と eol の両方を空にするには、

for /f delims^=^ eol^=

と、" " でパラメータを囲まずに特殊文字の = と空白を個別に ^ でクォートする。



*1 ただし、skip= パラメータは空行も含んだ行数を指定する

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-06-18 (土) 00:21:51 (6884d)