for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド
转载自:https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9#4トークンオプション-usebackq-
標準型
for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド
(オプション無し) ディレクトリ内を対象にとる
/d ディレクトリ(フォルダ)名を対象にとる
/r ディレクトリ名及びそのサブディレクトリ内(そのフォルダの中のファイル名やフォルダ名)を対象にとる
/l 値を指定して代入する
/f テキストファイル内の文章に対してトークンを取り出して代入する
1.forコマンドの基本
1.そもそもfor文とは?
2.for文の解剖~ (オプション) ~
3.for文の解剖~ %%アルファベット1文字 ~
4.for文の解剖~ in ループ処理の対象 do ~
2.forコマンドの構文①~ オプション無し…ディレクトリ内を対象にとる ~
3.forコマンドの構文②~ /d…ディレクトリ名を対象にとる ~
4.forコマンドの構文③~ /r…サブディレクトリまで対象にとる ~
5.forコマンドの構文④~ /l…指定した値で実行する ~
6.forコマンドの構文⑤~ /f…トークンを代入する ~
1.トークンオプション~ tokens ~
2.トークンオプション~ delims ~
3.トークンオプション~ eol,skip ~
4.トークンオプション~ usebackq ~
7.まとめ
1.forコマンドの基本
for文とは、「ループ」を行うコマンドです。
■for文の解剖
まとめ・注意点
・for文の変数は、%%iのように、アルファベット1文字を用いた特殊な記法となります。
・大文字と小文字は別物になります。数字の使用はサポートされていません。
・処理の対象は()内に記述します。
・inやdoを忘れないようにしましょう。
2.forコマンドの構文①~ オプション無し…ディレクトリ内を対象にとる ~
for %%アルファベット1文字 in (対象) do コマンド
例
@echo off
for %%i in (*.bat) do (
echo ファイル名:%%i
type %%i|more
)
pause
オプションがないとき、処理対象に記載された条件に該当するファイルやフォルダをカレントディレクトリから探して変数に代入します。
ちなみにカレントディレクトリとは、「現在のディレクトリ」。この場合はバッチファイル自身が存在するフォルダのことです。
分かりやすく言うと、例えばデスクトップにhoge.batとfuga.batがあったとして、hoge.batに上記の例が書かれていたとします。
ここでhoge.batを実行すると
実行の流れ:
1:オプションがないので、カレントディレクトリ(ここではデスクトップ)の中身を対象にする。
2:%%iに代入するように指示される。
3:*.batと書かれているので、拡張子がbatのファイル全てを検索する。
4:hoge.batが見つかったので、%%iにhoge.batと代入してdo以降のコマンドを実行する。
5:fuga.batが見つかったので、%%iにfuga.batと代入してdo以降のコマンドを実行する。
6:もうデスクトップにはbatはないので、終了。
(ちなみに、コマンドではファイル名を表示、その下にそのファイルの中身を出力してます。
そしてプロンプトの1番下の行に到達するたび一時停止します。)
hoge.bat
chcp 65001
@echo off
rem for %%i in (*.bat) do (
rem for %%i in (*) do (
for /r %%i in (h?ge.bat) do (
echo ファイル名: %%i
type %%i | more
)
pause
3.forコマンドの構文②~ /d…ディレクトリ名を対象にとる ~
先ほどの場合とほとんど変わりません。ただし、対象が「ディレクトリの中身」から「ディレクトリの中にあるディレクトリ」になります。
先ほどの例を使うなら、デスクトップにあるフォルダだけが対象となります。
それだけ。
chcp 65001
@echo off
for /d %%i in (*) do (
echo ファイル名: %%i
type %%i | more
)
pause
4.forコマンドの構文③~ /r…サブディレクトリまで対象にとる ~
先ほどの場合と略
ただし、対象がディレクトリの中身全部になります。
先ほどのバッチファイルの例を使うなら、例えば「デスクトップにある[バッチ]というフォルダの中にあるtest.bat」とかも対象になるわけです。
/rのあとにディレクトリを指定することで、カレントディレクトリ以外を処理の対象にできます。
こんな感じ。
for /r c:\ %%i in (*.txt) do type %%i|more
まとめ・注意点
・オプション無し、および/rではディレクトリの中身。/dではディレクトリ名。
・?と*はワイルドカード。それぞれ、1文字と複数文字が入ります。
・オプション無しのfor文はめったに使わないと思います。
chcp 65001
@echo off
rem for /r D:\temp %%i in (*.txt) do (
for /r D:\temp /d %%i in (sub*) do (
echo ファイル名: %%i
rem type %%i|more
)
pause
5.forコマンドの構文④~ /l…指定した値で実行する ~
5.forコマンドの構文④~ /l…指定した値で実行する ~
正直、ここまでに紹介した/dや/rはそこまで使用頻度は高くないと思います(あくまで体感ですが。)
次に紹介する/lは、おそらくfor文として最も使われる形ではないでしょうか。
値のループ
for /l %%i in (開始値、増分、終了値) do コマンド
例
for /l %%i in (1,2,10) do echo %%i
ラベルでも書けます。
set i=1
:loop
コマンド
set /a i+=2
if %i% leq 10 goto loop
一概にどちらが良いとは言い切れません。場合によります。
例えば、このiの値をさらに計算する場合などは、ラベルを用いたほうがわかりやすいでしょう。
こんな場合は…(余談!)
目標:10個の数字がnum[1],num[2]...num[10]に入っている。
隣り合った数字(num[1]とnum[2]、num[2]とnum[3]...)が同じかどうかを比較したい。
for文式
for /l %%i in (1,1,9) do (
set /a tempnum=%%i+1
call set tempnum=%%num[!tempnum!]%%
if !num[%%i]! equ !tempnum! コマンド
)
ラベル式
:loop
set /a loop+=1,loop2=loop+1
if !num[%loop%]! equ !num[%loop2%]! コマンド
if %loop2% lss 10 goto loop
まとめ・注意点
・/lでは、開始値、増分、終了値を取ってループさせる。
・必ずしもforを使う必要はない。
・↑でも慣れると非常に便利。
・多用されるので、少なくとも/lは読めるようにしておきたい。
@echo off
rem for /l %%i in (1,2,10) do echo %%i
set i=1
:loop
echo %i%
set /a i+=2
if %i% leq 10 goto loop
pause
6.forコマンドの構文⑤~ /f…トークンを代入する ~
ラスボスです。
トークンを代入
for /f "トークンオプション" %%i in (処理の対象) do コマンド
トークンオプション一覧
tokens= 何番目のトークンを指定するか?
delims= トークンの区切り文字を指定
eol= この文字から始まる行を無視
skip= 先頭から指定された行数、スキップする。
usebackq コマンドの出力を対象にする
テストデータ:
hogehoge.txt
1 2 3 4 5
a b c d e
a:i:u:e:o
hhh o:g ee:e
1.トークンオプション~ tokens ~
まずは、tokensについてです。
tokens
for /f "tokens=1,3" %%i in (hogehoge.txt) do echo %%i %%j
この例では、「1番目と3番目のトークンだけを取ってこい!」と言っています。
hogehoge.txtの各行から1,3番目のトークンを取得してechoするので、
tokensの結果
1 3
a c
a:i:u:e:o (注:3番目のトークンは無いので、当然表示されない。)
hhh ee:e
ポイント
2つ以上のトークンを指定したとき、2つ目以降のトークンは指定したアルファベットの次の文字が勝手に宣言、使用されます。
初めにiを指定したら次はj,k,l...とトークンの数だけ続きます。
zの次の文字は存在しない(するけど可読性が酷い)ので、x,yなどからトークンを指定するのはお勧めしません。
また、例えば2,3,4,6番目のトークンを取りたいときは2-4,6と表記することもできます。
1番目のトークンだけを取得するときは、tokensを書く必要はありません。
2.トークンオプション~ delims ~
delims
for /f "tokens=1,3 delims=:" %%i in (hogehoge.txt) do echo %%i %%j
実行結果
1 2 3 4 5
a b c d e
a u
hhh o e
結果を見てなんとなく察していただけるでしょうか?delimsでは、トークン同士を区切る文字を変更できます。
このとき、元々の指定であるスペースとタブは区切り文字ではなくなります。これを追加するには、
delims
for /f "tokens=1,3 delims=: " %%i in (hogehoge.txt) do echo %%i %%j
実行結果
1 3
a c
a u
hhh g
ポイント
区切り文字をスペースやタブ以外にも使う(空白も区切り文字に含める)場合、
delimsはオプションの最後に、スペースはさらにその最後("の手前)に。
スペースとタブ両方使う場合は、タブを先に書きましょう。
3.トークンオプション~ eol,skip ~
hogehoge.txt
1 2 3 4 5
a b c d e
a:i:u:e:o
hhh o:g ee:e
for /l "tokens=1,3 eol=a" %%i in (hogehoge.txt) do echo %%i %%j
実行結果
1 3
hhh ee:e
for /l "tokens=1,3 skip=2" in (hogehoge.txt) do echo %%i %%j
実行結果
a:i:u:e:o
hhh ee:e
特に語ることはありません。
eolで指定した文字から始まる行を無視、skipで指定した行数分先頭から無視です。
4.トークンオプション~ usebackq ~
このオプションだけは、テキストファイルを通しません。
usebackq
for /f "usebackq tokens=1 delims==" %%i in (`set`) do echo %%i
usebackqを使用すると、コマンドプロンプト上で使用できるMSDOSコマンドの出力を対象とすることができます。
この例では、デフォルトで設定されている環境変数名を表示します。
実際に、以下の内容のバッチファイルを作ってみてください。
usebackq.bat
@echo off
mode con lines=40 cols=200
set
pause >nul
cls
for /f "usebackq tokens=1 delims==" %%i in (`set`) do echo %%i
pause >nul