今はもうOSに標準でPowerShellが搭載されている時代です。Windows 2000世代からはWSHが標準搭載されバッチファイルから解放されました。Windows 7, Windows Server 2008ではPowerShellが標準搭載されWSHからも解放されました。.net frameworkも使いつつオブジェクト指向のスクリプトが書ける、そんないい時代になりました。めでたしめでたし…とはいかないのがこの業界です。残念ながら最新のOS上でいまだにバッチファイルを書かなければならない仕事、未だに仮想化されたWindowsNTの面倒を見なければいけない仕事などが存在するのが現実です。
バッチファイルでは実際のところ相当生産性が低いのですが、そんな中で異彩を放つコマンド”for”。その名前からはただの繰り返しコマンドに思えるのですが、実は恐ろしい力を秘めています。実際の所バッチファイルでちょっと複雑なことをやろうと思うとforを効果的に使わないといけません。今回は未だにバッチファイルを書かなければいけない不幸な人のためにforコマンドのTips集をお届けします。
forコマンドのヘルプから読み取れる「できること」# forコマンドは色々な事ができるコマンドなのですが、まじまじとヘルプを見たことが無い人も多いと思います。以下はWindows7のforコマンドのヘルプです。
指 定 さ れ た コ マ ン ド を フ ァ イ ル セ ッ ト の 各 フ ァ イ ル に 対 し て 実 行 し ま す 。
F O R % 変 数 I N ( セ ッ ト ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
% 変 数 単 一 文 字 の 置 き 換 え 可 能 な パ ラ メ ー タ ー を 指 定 し ま す 。
( セ ッ ト ) フ ァ イ ル セ ッ ト を 指 定 し ま す 。 ワ イ ル ド カ ー ド を 使 用 で き ま す 。
コ マ ン ド 各 フ ァ イ ル ご と に 実 行 す る コ マ ン ド を 指 定 し ま す 。
コ マ ン ド パ ラ メ ー タ ー
指 定 さ れ た コ マ ン ド の パ ラ メ ー タ ー ま た は ス イ ッ チ を 指 定 し ま す 。
バ ッ チ プ ロ グ ラ ム で F O R コ マ ン ド を 使 用 す る と き は 、 % 変 数 の 代 わ り に 、
% % 変 数 を 使 用 し て く だ さ い 。 変 数 名 で は 大 文 字 と 小 文 字 が 区 別 さ れ る た め 、
% i と % I は 異 な り ま す 。
コ マ ン ド 拡 張 機 能 を 有 効 に す る と 、 次 の F O R コ マ ン ド の 追 加 形 式
が サ ポ ー ト さ れ る よ う に な り ま す :
F O R / D % 変 数 I N ( セ ッ ト ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
セ ッ ト が ワ イ ル ド カ ー ド を 含 む 場 合 は 、 フ ァ イ ル 名 で は な く デ ィ レ ク ト リ 名
の 一 致 を 指 定 し ま す 。
F O R / R [ [ ド ラ イ ブ : ] パ ス ] % 変 数 I N ( セ ッ ト ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
[ ド ラ イ ブ : ] パ ス か ら 始 め て 、 ツ リ ー の 各 デ ィ レ ク ト リ で F O R 文 を 実 行 し
ま す 。 / R の 後 に デ ィ レ ク ト リ が 指 定 さ れ て い な い 場 合 は 、 現 在 の
デ ィ レ ク ト リ が 使 用 さ れ ま す 。 セ ッ ト が 単 一 の ピ リ オ ド で あ る 場 合 は 、
デ ィ レ ク ト リ ツ リ ー の 列 挙 だ け を 行 い ま す 。
F O R / L % 変 数 I N ( 開 始 , ス テ ッ プ , 終 了 ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
セ ッ ト は 、 ス テ ッ プ の 量 ご と に 変 化 す る 開 始 か ら 終 了 ま で の 数 列 で す 。
た と え ば 、 ( 1 , 1 , 5 ) は 1 2 3 4 5 、 ( 5 , - 1 , 1 ) は ( 5 4 3 2 1 ) と い う 数 列 に
な り ま す 。
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( フ ァ イ ル セ ッ ト ) D O コ マ ン ド
[ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( " 文 字 列 " ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ' コ マ ン ド ' ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
ま た は u s e b a c k q オ プ シ ョ ン の 場 合 :
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( フ ァ イ ル セ ッ ト ) D O コ マ ン ド
[ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ' 文 字 列 ' ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( ` コ マ ン ド ` ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
フ ァ イ ル セ ッ ト は 、 1 つ 以 上 の フ ァ イ ル 名 で す 。 各 フ ァ イ ル が 開 か れ 、
読 み 取 ら れ 、 処 理 さ れ て か ら 、 フ ァ イ ル セ ッ ト の 次 の フ ァ イ ル に 進 み ま す 。
処 理 で は 、 フ ァ イ ル の 読 み 取 り 、 個 々 の テ キ ス ト 行 へ の 分 割 と 、 0 個 以 上 の
ト ー ク ン へ の 解 析 が 行 わ れ ま す 。 そ の 後 、 見 つ か っ た ト ー ク ン 文 字 列 を 変 数 値 に
設 定 し て f o r ル ー プ の 本 体 が 呼 び 出 さ れ ま す 。 既 定 で は 、 / F は 、 各 フ ァ イ ル の
各 行 か ら 、 空 白 で 区 切 ら れ た 最 初 の ト ー ク ン を 取 得 し て 渡 し ま す 。 空 白 行 は
ス キ ッ プ さ れ ま す 。 既 定 の 解 析 動 作 を 変 更 す る に は 、 省 略 可 能 な " オ プ シ ョ ン "
パ ラ メ ー タ ー を 指 定 し ま す 。 こ れ は 、 異 な る 解 析 オ プ シ ョ ン を 指 定 す る 1 つ 以 上 の
キ ー ワ ー ド を 含 む 、 引 用 符 で 囲 ま れ た 文 字 列 で す 。 キ ー ワ ー ド は 、 次 の と お り で す :
e o l = c - 行 末 の コ メ ン ト 文 字 を 指 定 し ま す ( 1 文 字 ) 。
s k i p = n - フ ァ イ ル の 先 頭 で ス キ ッ プ す る 行 数 を 指 定 し ま す 。
d e l i m s = x x x - 区 切 り 文 字 の セ ッ ト を 指 定 し ま す 。
こ れ は 、 既 定 の 区 切 り 文 字 で あ る ス ペ ー ス と タ ブ を
置 き 換 え ま す 。
t o k e n s = x , y , m - n - 各 繰 り 返 し に 対 し て 、 各 行 か ら f o r 本 体 に 渡 す
ト ー ク ン を 指 定 し ま す 。 こ れ に よ り 、 追 加 の 変 数 名 が
割 り 当 て ら れ ま す 。
m - n の 形 式 は 範 囲 で 、 m 番 目 か ら n 番 目 の
ト ー ク ン を 指 定 し ま す 。
t o k e n s = 文 字 列 の 最 後 の 文 字 が ア ス タ リ ス ク で あ る 場 合 は 、
追 加 の 変 数 が 割 り 当 て ら れ 、 最 後 の ト ー ク ン が 解 析 さ れ た
後 、 行 に 含 ま れ て い る 残 り の テ キ ス ト を 受 け 取 り ま す 。
u s e b a c k q - 次 の 新 し い 表 示 形 式 を 指 定 し ま す 。
逆 引 用 符 で 囲 ま れ た 文 字 列 が コ マ ン ド と し て 実 行 さ れ 、
一 重 引 用 符 で 囲 ま れ た 文 字 列 が リ テ ラ ル 文 字 列 コ マ ン ド に
な り 、 フ ァ イ ル セ ッ ト の フ ァ イ ル 名 を 二 重 引 用 符 で
囲 め る よ う に な り ま す 。
例 を 参 考 に し て く だ さ い :
F O R / F " e o l = ; t o k e n s = 2 , 3 * d e l i m s = , " % i i n ( m y f i l e . t x t ) d o @ e c h o % i % j % k
こ の 例 は 、 m y f i l e . t x t の 各 行 を 解 析 し ま す 。 セ ミ コ ロ ン で 始 ま る 行 を 無 視 し 、
各 行 の 2 番 目 と 3 番 目 の ト ー ク ン を f o r 本 体 に 渡 し ま す 。
ト ー ク ン は 、 コ ン マ ま た は ス ペ ー ス で 区 切 ら れ て い ま す 。
f o r 本 体 の 文 が % i で 2 番 目 の ト ー ク ン を 、 % j で 3 番 目 の ト ー ク ン を 取 得 し 、
% k で 3 番 目 以 降 の す べ て の ト ー ク ン を 取 得 し て い る こ と に
注 意 し て く だ さ い 。
ス ペ ー ス を 含 む フ ァ イ ル 名 に 対 し て は 、 二 重 引 用 符 で フ ァ イ ル 名 を 引 用 す る
必 要 が あ り ま す 。
こ の 方 法 で 二 重 引 用 符 を 使 う た め に は 、 u s e b a c k q オ プ シ ョ ン も
使 わ な け れ ば な り ま せ ん 。
使 わ な け れ ば 、 二 重 引 用 符 は リ テ ラ ル 文 字 列 の 定 義 と し て
解 釈 さ れ 、 解 析 さ れ ま す 。
% i は f o r 文 で 明 示 的 に 宣 言 さ れ 、 % j と % k は t o k e n s = オ プ シ ョ ン で 暗 黙 的 に
宣 言 さ れ て い ま す 。
t o k e n s = 行 を 使 っ て 2 6 個 ま で の ト ー ク ン を 指 定 で き ま す が 、
文 字 ' z ' ま た は ' Z ' よ り も 高 い 変 数 を 宣 言 す る こ と は で き ま せ ん 。 F O R 変 数 名 は
単 一 の 文 字 で 、 大 文 字 と 小 文 字 を 区 別 し 、 グ ロ ー バ ル な も の で あ り 、 一 度 に
ア ク テ ィ ブ に で き る の は 合 計 5 2 個 ま で で す 。
ま た 、 か っ こ で 囲 ん だ フ ァ イ ル セ ッ ト を 一 重 引 用 符 で 囲 み 、 文 字 列 に す る こ と に
よ り 、 即 時 の 文 字 列 に 対 す る F O R / F 解 析 ロ ジ ッ ク を 使 う こ と も で き ま す 。
こ れ は 、 フ ァ イ ル か ら の 単 一 入 力 行 と し て 処 理 さ れ ま す 。
最 後 に 、 F O R / F コ マ ン ド を 使 っ て 、 コ マ ン ド 出 力 を 解 析 す る こ と が で き ま す 。
か っ こ の 中 の フ ァ イ ル セ ッ ト を 逆 引 用 符 で 囲 み ま す 。 こ の 文 字 列 は 、 コ マ ン ド
ラ イ ン と し て 子 C M D . E X E に 渡 さ れ ま す 。 出 力 は メ モ リ に キ ャ プ チ ャ さ れ 、
フ ァ イ ル の よ う に 解 析 さ れ ま す 。
例 :
F O R / F " u s e b a c k q d e l i m s = = " % i I N ( ` s e t ` ) D O @ e c h o % i
こ の 例 は 、 現 在 の 環 境 の 環 境 変 数 名 を 列 挙 し ま す 。
ま た 、 F O R 変 数 参 照 の 置 換 も 拡 張 さ れ ま し た 。
次 の オ プ シ ョ ン 構 文 を 使 う こ と が で き ま す :
% ~ I - す べ て の 引 用 句 ( " ) を 削 除 し て 、 % I を 展 開 し ま す 。
% ~ f I - % I を 完 全 修 飾 パ ス 名 に 展 開 し ま す 。
% ~ d I - % I を ド ラ イ ブ 文 字 だ け に 展 開 し ま す 。
% ~ p I - % I を パ ス 名 だ け に 展 開 し ま す 。
% ~ n I - % I を フ ァ イ ル 名 だ け に 展 開 し ま す 。
% ~ x I - % I を フ ァ イ ル 拡 張 子 だ け に 展 開 し ま す 。
% ~ s I - 展 開 さ れ た パ ス は 短 い 名 前 だ け を 含 み ま す 。
% ~ a I - % I を フ ァ イ ル の 属 性 に 展 開 し ま す 。
% ~ t I - % I フ ァ イ ル の 日 付 / 時 刻 に 展 開 し ま す 。
% ~ z I - % I フ ァ イ ル の サ イ ズ に 展 開 し ま す 。
% ~ $ P A T H : I - P A T H 環 境 変 数 に 指 定 さ れ て い る デ ィ レ ク ト リ を
検 索 し 、 最 初 に 見 つ か っ た 完 全 修 飾 名 に % I を
展 開 し ま す 。
環 境 変 数 名 が 定 義 さ れ て い な い 場 合 、 ま た は 検 索
し て も フ ァ イ ル が 見 つ か ら な か っ た 場 合 は 、 こ の
修 飾 子 を 指 定 す る と 空 の 文 字 列 に 展 開 さ れ ま す 。
修 飾 子 を 組 み 合 わ せ て 、 複 合 結 果 を 得 る こ と も で き ま す :
% ~ d p I - % I を ド ラ イ ブ 文 字 と パ ス だ け に 展 開 し ま す 。
% ~ n x I - % I を フ ァ イ ル 名 と 拡 張 子 だ け に 展 開 し ま す 。
% ~ f s I - % I を 完 全 な パ ス と 短 い 名 前 だ け に 展 開 し ま す 。
% ~ d p $ P A T H : I - P A T H 環 境 変 数 に 指 定 さ れ て い る デ ィ レ ク ト リ を
検 索 し て % I を 探 し 、 最 初 に 見 つ か っ た フ ァ イ ル
の ド ラ イ ブ 文 字 と パ ス だ け に 展 開 し ま す 。
% ~ f t z a I - % I を D I R コ マ ン ド の 出 力 行 の よ う に 展 開 し ま す 。
上 の 例 の % I と P A T H は 、 他 の 有 効 な 値 で 置 き 換 え る こ と が で き ま す 。
% ~ 構 文 は 、 有 効 な F O R 変 数 名 に よ っ て 区 切 ら れ ま す 。 % I の よ う な 大
文 字 の 変 数 を 使 う と 読 み 取 り や す く 、 大 文 字 と 小 文 字 を 区 別 し な い 修 飾 子
と の 混 乱 を 避 け る こ と が で き ま す 。
ヘルプの長さにまず驚かされますが、「指定されたコマンドをファイル セットの各ファイルに対して実行します。」と、ある通り、基本的には複数のファイルに対してコマンドを実行することが出来るコマンドということになっているようです。
F O R / D % 変 数 I N ( セ ッ ト ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
セ ッ ト が ワ イ ル ド カ ー ド を 含 む 場 合 は 、 フ ァ イ ル 名 で は な く デ ィ レ ク ト リ 名
の 一 致 を 指 定 し ま す 。
さらに上記のようにディレクトリに対しても処理を行えることがわかります。
F O R / R [ [ ド ラ イ ブ : ] パ ス ] % 変 数 I N ( セ ッ ト ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
[ ド ラ イ ブ : ] パ ス か ら 始 め て 、 ツ リ ー の 各 デ ィ レ ク ト リ で F O R 文 を 実 行 し
ま す 。 / R の 後 に デ ィ レ ク ト リ が 指 定 さ れ て い な い 場 合 は 、 現 在 の
デ ィ レ ク ト リ が 使 用 さ れ ま す 。 セ ッ ト が 単 一 の ピ リ オ ド で あ る 場 合 は 、
デ ィ レ ク ト リ ツ リ ー の 列 挙 だ け を 行 い ま す 。
ディレクトリツリーに対して再帰的に処理も行えるようです。
F O R / L % 変 数 I N ( 開 始 , ス テ ッ プ , 終 了 ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
セ ッ ト は 、 ス テ ッ プ の 量 ご と に 変 化 す る 開 始 か ら 終 了 ま で の 数 列 で す 。
た と え ば 、 ( 1 , 1 , 5 ) は 1 2 3 4 5 、 ( 5 , - 1 , 1 ) は ( 5 4 3 2 1 ) と い う 数 列 に
な り ま す 。
もちろん普通のプログラム言語のように数を変化させながら繰り返し処理もできます。
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( フ ァ イ ル セ ッ ト ) D O コ マ ン ド
[ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( " 文 字 列 " ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ' コ マ ン ド ' ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
ま た は u s e b a c k q オ プ シ ョ ン の 場 合 :
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( フ ァ イ ル セ ッ ト ) D O コ マ ン ド
[ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ' 文 字 列 ' ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
F O R / F [ " オ プ シ ョ ン " ] % 変 数 I N ( ` コ マ ン ド ` ) D O コ マ ン ド [ コ マ ン ド パ ラ メ ー タ ー ]
文字列やコマンドの結果に対しても処理ができちゃいます。
フ ァ イ ル セ ッ ト は 、 1 つ 以 上 の フ ァ イ ル 名 で す 。 各 フ ァ イ ル が 開 か れ 、
読 み 取 ら れ 、 処 理 さ れ て か ら 、 フ ァ イ ル セ ッ ト の 次 の フ ァ イ ル に 進 み ま す 。
処 理 で は 、 フ ァ イ ル の 読 み 取 り 、 個 々 の テ キ ス ト 行 へ の 分 割 と 、 0 個 以 上 の
ト ー ク ン へ の 解 析 が 行 わ れ ま す 。 そ の 後 、 見 つ か っ た ト ー ク ン 文 字 列 を 変 数 値 に
設 定 し て f o r ル ー プ の 本 体 が 呼 び 出 さ れ ま す 。 既 定 で は 、 / F は 、 各 フ ァ イ ル の
各 行 か ら 、 空 白 で 区 切 ら れ た 最 初 の ト ー ク ン を 取 得 し て 渡 し ま す 。 空 白 行 は
ス キ ッ プ さ れ ま す 。
さらにファイルに対してはその内容を読み取り行ごとに処理したり、さらに”トークンへの解析”までしてくれちゃいます。
既 定 の 解 析 動 作 を 変 更 す る に は 、 省 略 可 能 な " オ プ シ ョ ン "
パ ラ メ ー タ ー を 指 定 し ま す 。 こ れ は 、 異 な る 解 析 オ プ シ ョ ン を 指 定 す る 1 つ 以 上 の
キ ー ワ ー ド を 含 む 、 引 用 符 で 囲 ま れ た 文 字 列 で す 。 キ ー ワ ー ド は 、 次 の と お り で す :
e o l = c - 行 末 の コ メ ン ト 文 字 を 指 定 し ま す ( 1 文 字 ) 。
s k i p = n - フ ァ イ ル の 先 頭 で ス キ ッ プ す る 行 数 を 指 定 し ま す 。
d e l i m s = x x x - 区 切 り 文 字 の セ ッ ト を 指 定 し ま す 。
こ れ は 、 既 定 の 区 切 り 文 字 で あ る ス ペ ー ス と タ ブ を
置 き 換 え ま す 。
t o k e n s = x , y , m - n - 各 繰 り 返 し に 対 し て 、 各 行 か ら f o r 本 体 に 渡 す
ト ー ク ン を 指 定 し ま す 。 こ れ に よ り 、 追 加 の 変 数 名 が
割 り 当 て ら れ ま す 。
m - n の 形 式 は 範 囲 で 、 m 番 目 か ら n 番 目 の
ト ー ク ン を 指 定 し ま す 。
t o k e n s = 文 字 列 の 最 後 の 文 字 が ア ス タ リ ス ク で あ る 場 合 は 、
追 加 の 変 数 が 割 り 当 て ら れ 、 最 後 の ト ー ク ン が 解 析 さ れ た
後 、 行 に 含 ま れ て い る 残 り の テ キ ス ト を 受 け 取 り ま す 。
u s e b a c k q - 次 の 新 し い 表 示 形 式 を 指 定 し ま す 。
逆 引 用 符 で 囲 ま れ た 文 字 列 が コ マ ン ド と し て 実 行 さ れ 、
一 重 引 用 符 で 囲 ま れ た 文 字 列 が リ テ ラ ル 文 字 列 コ マ ン ド に
な り 、 フ ァ イ ル セ ッ ト の フ ァ イ ル 名 を 二 重 引 用 符 で
囲 め る よ う に な り ま す 。
コメント文字の指定や、スキップする行数の指定まで出来ますし、区切り文字の指定、本体に渡すトークン指定までできちゃいます。
ま た 、 F O R 変 数 参 照 の 置 換 も 拡 張 さ れ ま し た 。
次 の オ プ シ ョ ン 構 文 を 使 う こ と が で き ま す :
% ~ I - す べ て の 引 用 句 ( " ) を 削 除 し て 、 % I を 展 開 し ま す 。
% ~ f I - % I を 完 全 修 飾 パ ス 名 に 展 開 し ま す 。
% ~ d I - % I を ド ラ イ ブ 文 字 だ け に 展 開 し ま す 。
% ~ p I - % I を パ ス 名 だ け に 展 開 し ま す 。
% ~ n I - % I を フ ァ イ ル 名 だ け に 展 開 し ま す 。
% ~ x I - % I を フ ァ イ ル 拡 張 子 だ け に 展 開 し ま す 。
% ~ s I - 展 開 さ れ た パ ス は 短 い 名 前 だ け を 含 み ま す 。
% ~ a I - % I を フ ァ イ ル の 属 性 に 展 開 し ま す 。
% ~ t I - % I フ ァ イ ル の 日 付 / 時 刻 に 展 開 し ま す 。
% ~ z I - % I フ ァ イ ル の サ イ ズ に 展 開 し ま す 。
% ~ $ P A T H : I - P A T H 環 境 変 数 に 指 定 さ れ て い る デ ィ レ ク ト リ を
検 索 し 、 最 初 に 見 つ か っ た 完 全 修 飾 名 に % I を
展 開 し ま す 。
環 境 変 数 名 が 定 義 さ れ て い な い 場 合 、 ま た は 検 索
し て も フ ァ イ ル が 見 つ か ら な か っ た 場 合 は 、 こ の
修 飾 子 を 指 定 す る と 空 の 文 字 列 に 展 開 さ れ ま す 。
修 飾 子 を 組 み 合 わ せ て 、 複 合 結 果 を 得 る こ と も で き ま す :
% ~ d p I - % I を ド ラ イ ブ 文 字 と パ ス だ け に 展 開 し ま す 。
% ~ n x I - % I を フ ァ イ ル 名 と 拡 張 子 だ け に 展 開 し ま す 。
% ~ f s I - % I を 完 全 な パ ス と 短 い 名 前 だ け に 展 開 し ま す 。
% ~ d p $ P A T H : I - P A T H 環 境 変 数 に 指 定 さ れ て い る デ ィ レ ク ト リ を
検 索 し て % I を 探 し 、 最 初 に 見 つ か っ た フ ァ イ ル
の ド ラ イ ブ 文 字 と パ ス だ け に 展 開 し ま す 。
% ~ f t z a I - % I を D I R コ マ ン ド の 出 力 行 の よ う に 展 開 し ま す 。
さらにさらに変数の置換機能まであります。
…。さすがはforコマンドですね。「それは別のコマンドを用意したほうがいいんじゃないのか?」という機能まで満載されています。コマンドプロンプト、バッチファイルでは他の機能が貧弱なだけにforコマンドを多用することになります。
では、いくつか例を実行してみたいと思います。この手のものは「習うより慣れろ」ですから是非コマンドプロンプトを立ち上げて一緒に操作しながら読んでもらえればと思います。
ループ処理# まずは、テスト用のディレクトリを作成します。
1 : m k d i r c : \ f o r t e s t
2 : c d c : \ f o r t e s t
テスト用のテキストファイルを用意しましょう。適当に10個程度にしましょうか。せっかくですのでこれもforコマンドで作成してみましょう。
以下のように実行すると10個のテキストファイルが生成されます。
1 : c : \ f o r t e s t > f o r / L % i I N ( 1 , 1 , 1 0 ) D O e c h o s a m p l e % i > s a m p l e % i . t x t
2 :
3 : c : \ f o r t e s t > e c h o s a m p l e 1 1 > s a m p l e 1 . t x t
4 :
5 : c : \ f o r t e s t > e c h o s a m p l e 2 1 > s a m p l e 2 . t x t
6 :
7 : c : \ f o r t e s t > e c h o s a m p l e 3 1 > s a m p l e 3 . t x t
8 :
9 : c : \ f o r t e s t > e c h o s a m p l e 4 1 > s a m p l e 4 . t x t
1 0 :
1 1 : c : \ f o r t e s t > e c h o s a m p l e 5 1 > s a m p l e 5 . t x t
1 2 :
1 3 : c : \ f o r t e s t > e c h o s a m p l e 6 1 > s a m p l e 6 . t x t
1 4 :
1 5 : c : \ f o r t e s t > e c h o s a m p l e 7 1 > s a m p l e 7 . t x t
1 6 :
1 7 : c : \ f o r t e s t > e c h o s a m p l e 8 1 > s a m p l e 8 . t x t
1 8 :
1 9 : c : \ f o r t e s t > e c h o s a m p l e 9 1 > s a m p l e 9 . t x t
2 0 :
2 1 : c : \ f o r t e s t > e c h o s a m p l e 1 0 1 > s a m p l e 1 0 . t x t
/Lオプションを使用するとこのように変数の中に数字を入れつつ、コマンドを繰り返し実行させることができます。この例では変数%iに対して1から1つづつ値をふやしながら10になるまで「echo sample%1 > sample%i.txt」というコマンドを実行させています。これはいわゆるプログラム言語でいうところのfor文と同じような感じなので理解しやすいのではないかと思います。
ファイル名の取得# 次はファイル名の取得の例です。以下のように実行できます。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % i
2 : s a m p l e 1 . t x t
3 : s a m p l e 1 0 . t x t
4 : s a m p l e 2 . t x t
5 : s a m p l e 3 . t x t
6 : s a m p l e 4 . t x t
7 : s a m p l e 5 . t x t
8 : s a m p l e 6 . t x t
9 : s a m p l e 7 . t x t
1 0 : s a m p l e 8 . t x t
1 1 : s a m p l e 9 . t x t
オプションを付けずにforを実行すると、パターンにマッチするファイル名を取得して変数に1つづつ値を入れつつ、コマンドを実行させることができます。このパターンマッチにはディレクトリ(フォルダ)はマッチしません。以下のように確認できます。
1 : c : \ f o r t e s t > f o r / L % i I N ( 1 , 1 , 1 0 ) D O m k d i r d i r % i
2 :
3 : c : \ f o r t e s t > m k d i r d i r 1
4 :
5 : c : \ f o r t e s t > m k d i r d i r 2
6 :
7 : c : \ f o r t e s t > m k d i r d i r 3
8 :
9 : c : \ f o r t e s t > m k d i r d i r 4
1 0 :
1 1 : c : \ f o r t e s t > m k d i r d i r 5
1 2 :
1 3 : c : \ f o r t e s t > m k d i r d i r 6
1 4 :
1 5 : c : \ f o r t e s t > m k d i r d i r 7
1 6 :
1 7 : c : \ f o r t e s t > m k d i r d i r 8
1 8 :
1 9 : c : \ f o r t e s t > m k d i r d i r 9
2 0 :
2 1 : c : \ f o r t e s t > m k d i r d i r 1 0
2 2 :
2 3 : c : \ f o r t e s t > f o r % i I N D O @ e c h o % i
2 4 : s a m p l e 1 . t x t
2 5 : s a m p l e 1 0 . t x t
2 6 : s a m p l e 2 . t x t
2 7 : s a m p l e 3 . t x t
2 8 : s a m p l e 4 . t x t
2 9 : s a m p l e 5 . t x t
3 0 : s a m p l e 6 . t x t
3 1 : s a m p l e 7 . t x t
3 2 : s a m p l e 8 . t x t
3 3 : s a m p l e 9 . t x t
3 4 :
3 5 : c : \ f o r t e s t > d i r
3 6 : ド ラ イ ブ C の ボ リ ュ ー ム ラ ベ ル が あ り ま せ ん 。
3 7 : ボ リ ュ ー ム シ リ ア ル 番 号 は C 0 A F - 1 B 4 F で す
3 8 :
3 9 : c : \ f o r t e s t の デ ィ レ ク ト リ
4 0 :
4 1 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9
4 2 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9
4 3 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 1
4 4 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 1 0
4 5 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 2
4 6 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 3
4 7 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 4
4 8 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 5
4 9 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 6
5 0 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 7
5 1 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 8
5 2 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9 d i r 9
5 3 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 1 . t x t
5 4 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 1 s a m p l e 1 0 . t x t
5 5 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 2 . t x t
5 6 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 3 . t x t
5 7 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 4 . t x t
5 8 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 5 . t x t
5 9 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 6 . t x t
6 0 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 7 . t x t
6 1 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 8 . t x t
6 2 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 9 . t x t
6 3 : 1 0 個 の フ ァ イ ル 1 0 1 バ イ ト
6 4 : 1 2 個 の デ ィ レ ク ト リ 1 4 2 , 8 5 9 , 3 7 8 , 6 8 8 バ イ ト の 空 き 領 域
ディレクトリ名の取得# /Dオプションをつけて実行すると、ディレクトリのみがパターンにマッチするようになります。
1 : c : \ f o r t e s t > f o r / D % i I N D O @ e c h o % i
2 : d i r 1
3 : d i r 1 0
4 : d i r 2
5 : d i r 3
6 : d i r 4
7 : d i r 5
8 : d i r 6
9 : d i r 7
1 0 : d i r 8
1 1 : d i r 9
再帰処理# ディレクトリを指定し、そこから下位のディレクトリのそれぞれでforコマンドを実行させることができます。ちょっとディレクトリ、ファイルを準備してみます。
1 : c : \ f o r t e s t > f o r / L % i I N ( 1 , 1 , 1 0 ) D O e c h o s a m p l e % i > \ d i r % i \ s a m p l e % i . t x t
2 :
3 : c : \ f o r t e s t > e c h o s a m p l e 1 1 > . \ d i r 1 \ s a m p l e 1 . t x t
4 :
5 : c : \ f o r t e s t > e c h o s a m p l e 2 1 > . \ d i r 2 \ s a m p l e 2 . t x t
6 :
7 : c : \ f o r t e s t > e c h o s a m p l e 3 1 > . \ d i r 3 \ s a m p l e 3 . t x t
8 :
9 : c : \ f o r t e s t > e c h o s a m p l e 4 1 > . \ d i r 4 \ s a m p l e 4 . t x t
1 0 :
1 1 : c : \ f o r t e s t > e c h o s a m p l e 5 1 > . \ d i r 5 \ s a m p l e 5 . t x t
1 2 :
1 3 : c : \ f o r t e s t > e c h o s a m p l e 6 1 > . \ d i r 6 \ s a m p l e 6 . t x t
1 4 :
1 5 : c : \ f o r t e s t > e c h o s a m p l e 7 1 > . \ d i r 7 \ s a m p l e 7 . t x t
1 6 :
1 7 : c : \ f o r t e s t > e c h o s a m p l e 8 1 > . \ d i r 8 \ s a m p l e 8 . t x t
1 8 :
1 9 : c : \ f o r t e s t > e c h o s a m p l e 9 1 > . \ d i r 9 \ s a m p l e 9 . t x t
2 0 :
2 1 : c : \ f o r t e s t > e c h o s a m p l e 1 0 1 > . \ d i r 1 0 \ s a m p l e 1 0 . t x t
2 2 :
2 3 : c : \ f o r t e s t > d i r / s
2 4 : ド ラ イ ブ C の ボ リ ュ ー ム ラ ベ ル が あ り ま せ ん 。
2 5 : ボ リ ュ ー ム シ リ ア ル 番 号 は C 0 A F - 1 B 4 F で す
2 6 :
2 7 : c : \ f o r t e s t の デ ィ レ ク ト リ
2 8 :
2 9 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9
3 0 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 9
3 1 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 1
3 2 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 1 0
3 3 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 2
3 4 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 3
3 5 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 4
3 6 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 5
3 7 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 6
3 8 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 7
3 9 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 8
4 0 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 9
4 1 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 1 . t x t
4 2 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 1 s a m p l e 1 0 . t x t
4 3 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 2 . t x t
4 4 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 3 . t x t
4 5 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 4 . t x t
4 6 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 5 . t x t
4 7 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 6 . t x t
4 8 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 7 . t x t
4 9 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 8 . t x t
5 0 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 9 . t x t
5 1 : 1 0 個 の フ ァ イ ル 1 0 1 バ イ ト
5 2 :
5 3 : c : \ f o r t e s t \ d i r 1 の デ ィ レ ク ト リ
5 4 :
5 5 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
5 6 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
5 7 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 1 . t x t
5 8 : 1 個 の フ ァ イ ル 1 0 バ イ ト
5 9 :
6 0 : c : \ f o r t e s t \ d i r 1 0 の デ ィ レ ク ト リ
6 1 :
6 2 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
6 3 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
6 4 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 1 s a m p l e 1 0 . t x t
6 5 : 1 個 の フ ァ イ ル 1 1 バ イ ト
6 6 :
6 7 : c : \ f o r t e s t \ d i r 2 の デ ィ レ ク ト リ
6 8 :
6 9 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
7 0 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
7 1 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 2 . t x t
7 2 : 1 個 の フ ァ イ ル 1 0 バ イ ト
7 3 :
7 4 : c : \ f o r t e s t \ d i r 3 の デ ィ レ ク ト リ
7 5 :
7 6 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
7 7 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
7 8 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 3 . t x t
7 9 : 1 個 の フ ァ イ ル 1 0 バ イ ト
8 0 :
8 1 : c : \ f o r t e s t \ d i r 4 の デ ィ レ ク ト リ
8 2 :
8 3 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
8 4 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
8 5 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 4 . t x t
8 6 : 1 個 の フ ァ イ ル 1 0 バ イ ト
8 7 :
8 8 : c : \ f o r t e s t \ d i r 5 の デ ィ レ ク ト リ
8 9 :
9 0 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
9 1 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
9 2 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 5 . t x t
9 3 : 1 個 の フ ァ イ ル 1 0 バ イ ト
9 4 :
9 5 : c : \ f o r t e s t \ d i r 6 の デ ィ レ ク ト リ
9 6 :
9 7 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
9 8 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
9 9 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 6 . t x t
1 0 0 : 1 個 の フ ァ イ ル 1 0 バ イ ト
1 0 1 :
1 0 2 : c : \ f o r t e s t \ d i r 7 の デ ィ レ ク ト リ
1 0 3 :
1 0 4 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
1 0 5 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
1 0 6 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 7 . t x t
1 0 7 : 1 個 の フ ァ イ ル 1 0 バ イ ト
1 0 8 :
1 0 9 : c : \ f o r t e s t \ d i r 8 の デ ィ レ ク ト リ
1 1 0 :
1 1 1 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
1 1 2 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
1 1 3 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 8 . t x t
1 1 4 : 1 個 の フ ァ イ ル 1 0 バ イ ト
1 1 5 :
1 1 6 : c : \ f o r t e s t \ d i r 9 の デ ィ レ ク ト リ
1 1 7 :
1 1 8 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
1 1 9 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5
1 2 0 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 1 0 s a m p l e 9 . t x t
1 2 1 : 1 個 の フ ァ イ ル 1 0 バ イ ト
1 2 2 :
1 2 3 : フ ァ イ ル の 総 数 :
1 2 4 : 2 0 個 の フ ァ イ ル 2 0 2 バ イ ト
1 2 5 : 3 2 個 の デ ィ レ ク ト リ 1 4 2 , 8 6 9 , 6 5 9 , 6 4 8 バ イ ト の 空 き 領 域
これで、カレントディレクトリにはディレクトリが10個、ファイルが10個。サブディレクトリにはそれぞれファイルが1個づつという状態になりました。現在のディレクトリ以下にある.txtという拡張子を持つファイルを全て表示してみます。
1 : c : \ f o r t e s t > f o r / R % i I N . t x t ) D O @ e c h o % i
2 : c : \ f o r t e s t \ s a m p l e 1 . t x t
3 : c : \ f o r t e s t \ s a m p l e 1 0 . t x t
4 : c : \ f o r t e s t \ s a m p l e 2 . t x t
5 : c : \ f o r t e s t \ s a m p l e 3 . t x t
6 : c : \ f o r t e s t \ s a m p l e 4 . t x t
7 : c : \ f o r t e s t \ s a m p l e 5 . t x t
8 : c : \ f o r t e s t \ s a m p l e 6 . t x t
9 : c : \ f o r t e s t \ s a m p l e 7 . t x t
1 0 : c : \ f o r t e s t \ s a m p l e 8 . t x t
1 1 : c : \ f o r t e s t \ s a m p l e 9 . t x t
1 2 : c : \ f o r t e s t \ d i r 1 \ s a m p l e 1 . t x t
1 3 : c : \ f o r t e s t \ d i r 1 0 \ s a m p l e 1 0 . t x t
1 4 : c : \ f o r t e s t \ d i r 2 \ s a m p l e 2 . t x t
1 5 : c : \ f o r t e s t \ d i r 3 \ s a m p l e 3 . t x t
1 6 : c : \ f o r t e s t \ d i r 4 \ s a m p l e 4 . t x t
1 7 : c : \ f o r t e s t \ d i r 5 \ s a m p l e 5 . t x t
1 8 : c : \ f o r t e s t \ d i r 6 \ s a m p l e 6 . t x t
1 9 : c : \ f o r t e s t \ d i r 7 \ s a m p l e 7 . t x t
2 0 : c : \ f o r t e s t \ d i r 8 \ s a m p l e 8 . t x t
2 1 : c : \ f o r t e s t \ d i r 9 \ s a m p l e 9 . t x t
ディレクトリ名だけ表示するには以下のようにします。
1 : c : \ f o r t e s t > f o r / R % i I N D O @ e c h o % i
2 : c : \ f o r t e s t \ .
3 : c : \ f o r t e s t \ d i r 1 \ .
4 : c : \ f o r t e s t \ d i r 1 0 \ .
5 : c : \ f o r t e s t \ d i r 2 \ .
6 : c : \ f o r t e s t \ d i r 3 \ .
7 : c : \ f o r t e s t \ d i r 4 \ .
8 : c : \ f o r t e s t \ d i r 5 \ .
9 : c : \ f o r t e s t \ d i r 6 \ .
1 0 : c : \ f o r t e s t \ d i r 7 \ .
1 1 : c : \ f o r t e s t \ d i r 8 \ .
1 2 : c : \ f o r t e s t \ d i r 9 \ .
カレントディレクトリ(.)にだけマッチさせるような感じですね。
ファイルの中身へのアクセス# さて、次はいよいよファイルの中身へのアクセスです。これは/Fオプションで実現できます。
まず、テストのためにファイル内に10行書かれているファイルを用意します。これもfor文でやりましょう。
1 : c : \ f o r t e s t > f o r / L % i I N ( 1 , 1 , 1 0 ) D O e c h o % i 行 目 s a m p l e . t x t
2 :
3 : c : \ f o r t e s t > e c h o 1 行 目 1 > > s a m p l e . t x t
4 :
5 : c : \ f o r t e s t > e c h o 2 行 目 1 > > s a m p l e . t x t
6 :
7 : c : \ f o r t e s t > e c h o 3 行 目 1 > > s a m p l e . t x t
8 :
9 : c : \ f o r t e s t > e c h o 4 行 目 1 > > s a m p l e . t x t
1 0 :
1 1 : c : \ f o r t e s t > e c h o 5 行 目 1 > > s a m p l e . t x t
1 2 :
1 3 : c : \ f o r t e s t > e c h o 6 行 目 1 > > s a m p l e . t x t
1 4 :
1 5 : c : \ f o r t e s t > e c h o 7 行 目 1 > > s a m p l e . t x t
1 6 :
1 7 : c : \ f o r t e s t > e c h o 8 行 目 1 > > s a m p l e . t x t
1 8 :
1 9 : c : \ f o r t e s t > e c h o 9 行 目 1 > > s a m p l e . t x t
2 0 :
2 1 : c : \ f o r t e s t > e c h o 1 0 行 目 1 > > s a m p l e . t x t
2 2 :
2 3 : c : \ f o r t e s t > t y p e s a m p l e . t x t
2 4 : 1 行 目
2 5 : 2 行 目
2 6 : 3 行 目
2 7 : 4 行 目
2 8 : 5 行 目
2 9 : 6 行 目
3 0 : 7 行 目
3 1 : 8 行 目
3 2 : 9 行 目
3 3 : 1 0 行 目
このファイルの中身を1行づつ読み取ってみます。
1 : c : \ f o r t e s t > f o r / F % i I N ( s a m p l e . t x t ) D O @ e c h o % i
2 : 1 行 目
3 : 2 行 目
4 : 3 行 目
5 : 4 行 目
6 : 5 行 目
7 : 6 行 目
8 : 7 行 目
9 : 8 行 目
1 0 : 9 行 目
1 1 : 1 0 行 目
「type sample.txt」を実行した結果と同じ結果になるわけですが、1行づつ読み取り、それが変数%iに入れられ、それが1行づつechoされているのがわかりますでしょうか。
もうちょっとわかりやすくするために以下のようにしてみましょうか。
1 : c : \ f o r t e s t > f o r / F % i I N ( s a m p l e . t x t ) D O @ e c h o % i を 出 力 し て い ま す 。
2 : 1 行 目 を 出 力 し て い ま す 。
3 : 2 行 目 を 出 力 し て い ま す 。
4 : 3 行 目 を 出 力 し て い ま す 。
5 : 4 行 目 を 出 力 し て い ま す 。
6 : 5 行 目 を 出 力 し て い ま す 。
7 : 6 行 目 を 出 力 し て い ま す 。
8 : 7 行 目 を 出 力 し て い ま す 。
9 : 8 行 目 を 出 力 し て い ま す 。
1 0 : 9 行 目 を 出 力 し て い ま す 。
1 1 : 1 0 行 目 を 出 力 し て い ま す 。
あまり内容は変わっていませんが、変数の中にファイルの内容が1行づつ入っていく様子がわかるかと思います。
ちなみに/Fオプションを使っているときにはパターンマッチは行えません。つまり内容を読み込んで処理できるのは1ファイルだということです。
1 : c : \ f o r t e s t > f o r / F % i I N . t x t ) D O @ e c h o % i を 出 力 し て い ま す 。
2 : フ ァ イ ル . t x t が 見 つ か り ま せ ん 。
文字列の処理、コマンドの結果# 上記の/Fオプションはファイルの中身に対してだけではなくて、文字列に対してやコマンドの結果に対しても同じように処理できます。
1 : c : \ f o r t e s t > f o r / F % i I N ( " h o g e h o g e " ) D O @ e c h o % i
2 : h o g e h o g e
これだとただ単にechoしているのと変わらないのですが(どう嬉しいのかはもうちょっと待ってください)。文字列は変数に入れておくこともできます。
1 : c : \ f o r t e s t > s e t m o j i r e t s u = h o g e h o g e
2 :
3 : c : \ f o r t e s t > e c h o % m o j i r e t s u %
4 : h o g e h o g e
5 :
6 : c : \ f o r t e s t > f o r / F % i I N ( " % m o j i r e t s u % " ) D O @ e c h o % i
7 : h o g e h o g e
コマンドの結果を処理する場合には「’’」を使ってコマンドを囲むことで実現できます。
1 : c : \ f o r t e s t > f o r / F % i I N ' i p c o n f i g ' ) D O @ e c h o % i
2 : W i n d o w s
3 : W i r e l e s s
4 : 接 続 固 有 の
5 : リ ン ク ロ ー カ ル
6 : I P v 4
7 : サ ブ ネ ッ ト
8 : デ フ ォ ル ト
9 : イ ー サ ネ ッ ト
1 0 : メ デ ィ ア の 状 態 .
1 1 : 接 続 固 有 の
1 2 : T u n n e l
1 3 : メ デ ィ ア の 状 態 .
1 4 : 接 続 固 有 の
1 5 : T u n n e l
1 6 : メ デ ィ ア の 状 態 .
1 7 : 接 続 固 有 の
1 8 : T u n n e l
1 9 : 接 続 固 有 の
2 0 : I P v 6
2 1 : リ ン ク ロ ー カ ル
2 2 : デ フ ォ ル ト
2 3 : T u n n e l
2 4 : メ デ ィ ア の 状 態 .
2 5 : 接 続 固 有 の
2 6 : T u n n e l
2 7 : メ デ ィ ア の 状 態 .
2 8 : 接 続 固 有 の
おや。出力がipconfigの結果そのままではありませんね。これは規定の状態で以下のようになっているからです。(ヘルプより引用)
既定では、/F は、各ファイルの各行から、空白で区切られた最初のトークンを取得して渡します。空白行はスキップされます。
空白行はスキップされた上で、空白で区切っているわけです。もう一度単純な文字列を処理する例を見ましょう。
1 : c : \ f o r t e s t > f o r / F % i I N ( " h o g e 1 h o g e 2 " ) D O @ e c h o % i
2 : h o g e 1
文字列は空白で区切られているので1つめのトークンの”hoge1”が%iに入れられています。2つめのトークンである”hoge2”は単純に捨てられています。これも受け取りたい場合にはtokensオプションを指定します。
1 : c : \ f o r t e s t > f o r / F " t o k e n s = * " % i I N ( " h o g e 1 h o g e 2 " ) D O @ e c h o % i
2 : h o g e 1 h o g e 2
1 : c : \ f o r t e s t > f o r / F " t o k e n s = * " % i I N ' i p c o n f i g ' ) D O @ e c h o % i
2 : W i n d o w s I P 構 成
3 : W i r e l e s s L A N a d a p t e r w l a n :
4 : 接 続 固 有 の D N S サ フ ィ ッ ク ス . . :
5 : リ ン ク ロ ー カ ル I P v 6 ア ド レ ス . . : f e 8 0 : : 8 d 7 e : 8 9 2 5 : 9 d 7 e : 3 8 a 2 % 1 8
6 : I P v 4 ア ド レ ス . . : 1 9 2 . 1 6 8 . 1 . 1 0 8
7 : サ ブ ネ ッ ト マ ス ク . . : 2 5 5 . 2 5 5 . 2 5 5 . 0
8 : デ フ ォ ル ト ゲ ー ト ウ ェ イ . . : 1 9 2 . 1 6 8 . 1 . 1
9 : イ ー サ ネ ッ ト ア ダ プ タ ー l a n :
1 0 : メ デ ィ ア の 状 態 . . : メ デ ィ ア は 接 続 さ れ て い ま せ ん
1 1 : 接 続 固 有 の D N S サ フ ィ ッ ク ス . . : t e s t . l o c a l
1 2 : T u n n e l a d a p t e r i s a t a p . j b s . l o c a l :
1 3 : メ デ ィ ア の 状 態 . . : メ デ ィ ア は 接 続 さ れ て い ま せ ん
1 4 : 接 続 固 有 の D N S サ フ ィ ッ ク ス . . :
1 5 : T u n n e l a d a p t e r 6 T O 4 A d a p t e r :
1 6 : メ デ ィ ア の 状 態 . . : メ デ ィ ア は 接 続 さ れ て い ま せ ん
1 7 : 接 続 固 有 の D N S サ フ ィ ッ ク ス . . :
1 8 : T u n n e l a d a p t e r ロ ー カ ル エ リ ア 接 続 * 1 4 :
1 9 : 接 続 固 有 の D N S サ フ ィ ッ ク ス . . :
2 0 : I P v 6 ア ド レ ス . . : 2 0 0 1 : 0 : 4 1 3 7 : 9 e 7 6 : 1 c c a : 1 6 f 7 : 2 5 1 8 : 6 4 1 c
2 1 : リ ン ク ロ ー カ ル I P v 6 ア ド レ ス . . : f e 8 0 : : 1 c c a : 1 6 f 7 : 2 5 1 8 : 6 4 1 c % 1 5
2 2 : デ フ ォ ル ト ゲ ー ト ウ ェ イ . . : : :
2 3 : T u n n e l a d a p t e r i s a t a p . { 0 A 1 0 F 0 F C - 9 A B B - 4 2 D 0 - 8 C 7 3 - C 7 1 B 2 9 7 6 D 3 B 0 } :
2 4 : メ デ ィ ア の 状 態 . . : メ デ ィ ア は 接 続 さ れ て い ま せ ん
2 5 : 接 続 固 有 の D N S サ フ ィ ッ ク ス . . :
2 6 : T u n n e l a d a p t e r R e u s a b l e M i c r o s o f t 6 T o 4 A d a p t e r :
2 7 : メ デ ィ ア の 状 態 . . : メ デ ィ ア は 接 続 さ れ て い ま せ ん
2 8 : 接 続 固 有 の D N S サ フ ィ ッ ク ス . . :
上記の2つの例では「tokens=*」とオプションを指定することで空白で区切ることをせず、行全部を1つのトークンにするように指定しました。なので、1行全てが%iに入っています。
空白では区切りつつ、2つの別々の変数で受け取る場合には以下の用にします。
1 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 , 2 " % i I N ( " h o g e 1 h o g e 2 " ) D O @ e c h o % i % j
2 : h o g e 1 h o g e 2
「tokens=1,2」と指定することで1番目と2番目のトークンをそれぞれ%i, %jに入力しています。%iは明示的に宣言されているのですが、%jはいきなり登場しています。これはもうこういうものだと思ってしまうしか無いと思います。%iからはじめるなら、%i, %j, %k …と順番になります。
もちろんtokenの選び方は自由です。
1 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 , 3 " % i I N ( " h o g e 1 h o g e 2 h o g e 3 " ) D O @ e c h o % i % j
2 : h o g e 1 h o g e 3
3 :
上記のように1番目と3番目を取得するようなこともできます。
1 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 , 3 * " % i I N ( " h o g e 1 h o g e 2 h o g e 3 h o g e 4 h o g e 5 h o g e 6 " ) D O @ e c h o % i % j - % k
2 : h o g e 1 h o g e 3 - h o g e 4 h o g e 5 h o g e 6
上記のように*を使うとその後のすべての文字が次の変数(ここでは%k)に入ります。*の前には「,」は必要ありません。(ちょっと文法的に違和感がありますが・・・)
1 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 - 5 " % i I N ( " h o g e 1 h o g e 2 h o g e 3 h o g e 4 h o g e 5 " ) D O @ e c h o % i % j % k % l % m
2 : h o g e 1 h o g e 2 h o g e 3 h o g e 4 h o g e 5
3 :
4 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 , 2 , 3 , 4 , 5 " % i I N ( " h o g e 1 h o g e 2 h o g e 3 h o g e 4 h o g e 5 " ) D O @ e c h o % i % j % k % l % m
5 : h o g e 1 h o g e 2 h o g e 3 h o g e 4 h o g e 5
上記のように”token=1-5”のように範囲で書くこともできます。この場合”tokens=1,2,3,4,5”と記述したのと全く同じ意味になります。
次に区切り文字です。規定では空白ですが、delimsオプションで指定することができます。
1 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 , 2 , 3 d e l i m s = , " % i I N ( " h o g e 1 , h o g e 2 , h o g e 3 " ) D O @ e c h o % i % j % k % l % m
2 : h o g e 1 h o g e 2 h o g e 3 % l % m
これは,(カンマ)で区切った例です。これを使えばCSVファイルを扱えるわけです。
CSVファイルの読み込み# 簡単なCSVファイルを準備します。
1 : c : \ f o r t e s t > e c h o 1 - 1 , 1 - 2 , 1 - 3 , 1 - 4 , 1 - 5 > s a m p l e . t x t
2 :
3 : c : \ f o r t e s t > e c h o 2 - 1 , 2 - 2 , 2 - 3 , 2 - 4 , 2 - 5 s a m p l e . t x t
4 :
5 : c : \ f o r t e s t > e c h o 3 - 1 , 3 - 2 , 3 - 3 , 3 - 4 , 3 - 5 s a m p l e . t x t
6 :
7 : c : \ f o r t e s t > t y p e s a m p l e . t x t
8 : 1 - 1 , 1 - 2 , 1 - 3 , 1 - 4 , 1 - 5
9 : 2 - 1 , 2 - 2 , 2 - 3 , 2 - 4 , 2 - 5
1 0 : 3 - 1 , 3 - 2 , 3 - 3 , 3 - 4 , 3 - 5
このCSVを1行づつ読み込み、カンマで区切り、5つの変数にそれぞれ値を代入し、表示します。
1 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 , 2 , 3 , 4 , 5 d e l i m s = , " % i I N ( s a m p l e . t x t ) D O @ e c h o % i % j % k % l % m
2 : 1 - 1 1 - 2 1 - 3 1 - 4 1 - 5
3 : 2 - 1 2 - 2 2 - 3 2 - 4 2 - 5
4 : 3 - 1 3 - 2 3 - 3 3 - 4 3 - 5
CSVファイルにコメント行があり読み飛ばしたい時にはeolオプションが使えます。
テスト用のCSVファイルを用意します。
1 : c : \ f o r t e s t > e c h o # コ メ ン ト 行 で す 。 s a m p l e . t x t
2 :
3 : c : \ f o r t e s t > e c h o 4 - 1 , 4 - 2 , 4 - 3 , 4 - 4 , 4 - 5 s a m p l e . t x t
4 :
5 : c : \ f o r t e s t > t y p e s a m p l e . t x t
6 : 1 - 1 , 1 - 2 , 1 - 3 , 1 - 4 , 1 - 5
7 : 2 - 1 , 2 - 2 , 2 - 3 , 2 - 4 , 2 - 5
8 : 3 - 1 , 3 - 2 , 3 - 3 , 3 - 4 , 3 - 5
9 : # コ メ ン ト 行 で す 。
1 0 : 4 - 1 , 4 - 2 , 4 - 3 , 4 - 4 , 4 - 5
1 : c : \ f o r t e s t > f o r / F " t o k e n s = 1 , 2 , 3 , 4 , 5 d e l i m s = , e o l = # " % i I N ( s a m p l e . t x t ) D O @ e c h o % i % j % k % l % m
2 : 1 - 1 1 - 2 1 - 3 1 - 4 1 - 5
3 : 2 - 1 2 - 2 2 - 3 2 - 4 2 - 5
4 : 3 - 1 3 - 2 3 - 3 3 - 4 3 - 5
5 : 4 - 1 4 - 2 4 - 3 4 - 4 4 - 5
「eol=#」というオプションを追加することでコメント行をスキップすることが出来ました。
ファイル名に空白を含むファイルを扱いたい時# ここまでの知識でかなりの事が出来るのですが、このままだと「ファイル名に空白を含むものの処理」がうまくできなくて困ってしまいます。ちょっとやろうとしてみましょう。
1 : c : \ f o r t e s t > e c h o h o g e > " s a m p l e f i l e . t x t "
2 :
3 : c : \ f o r t e s t > d i r
4 : ド ラ イ ブ C の ボ リ ュ ー ム ラ ベ ル が あ り ま せ ん 。
5 : ボ リ ュ ー ム シ リ ア ル 番 号 は C 0 A F - 1 B 4 F で す
6 :
7 : c : \ f o r t e s t の デ ィ レ ク ト リ
8 :
9 : 2 0 1 2 / 0 3 / 1 6 0 0 : 0 0
1 0 : 2 0 1 2 / 0 3 / 1 6 0 0 : 0 0
1 1 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 1
1 2 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 1 0
1 3 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 2
1 4 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 3
1 5 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 4
1 6 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 5
1 7 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 6
1 8 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 7
1 9 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 8
2 0 : 2 0 1 2 / 0 3 / 1 5 2 2 : 0 5 d i r 9
2 1 : 2 0 1 2 / 0 3 / 1 6 0 0 : 0 0 7 s a m p l e f i l e . t x t
2 2 : 2 0 1 2 / 0 3 / 1 5 2 3 : 5 1 1 0 7 s a m p l e . t x t
2 3 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 1 . t x t
2 4 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 1 s a m p l e 1 0 . t x t
2 5 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 2 . t x t
2 6 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 3 . t x t
2 7 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 4 . t x t
2 8 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 5 . t x t
2 9 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 6 . t x t
3 0 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 7 . t x t
3 1 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 8 . t x t
3 2 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5 1 0 s a m p l e 9 . t x t
3 3 : 1 2 個 の フ ァ イ ル 2 1 5 バ イ ト
3 4 : 1 2 個 の デ ィ レ ク ト リ 1 4 2 , 8 1 7 , 6 9 3 , 6 9 6 バ イ ト の 空 き 領 域
1 : c : \ f o r t e s t > f o r / F % i I N ( s a m p l e f i l e . t x t ) D O @ e c h o % i
2 : フ ァ イ ル s a m p l e が 見 つ か り ま せ ん 。
3 :
4 : c : \ f o r t e s t > f o r / F % i I N ( " s a m p l e f i l e . t x t " ) D O @ e c h o % i
5 : s a m p l e
6 :
7 : c : \ f o r t e s t > f o r / F % i I N ' s a m p l e f i l e . t x t ' ) D O @ e c h o % i
8 : ' s a m p l e ' は 、 内 部 コ マ ン ド ま た は 外 部 コ マ ン ド 、
9 : 操 作 可 能 な プ ロ グ ラ ム ま た は バ ッ チ フ ァ イ ル と し て 認 識 さ れ て い ま せ ん 。
うーん。うまくいきません。こういう時のためにusebackqオプションがあります。このオプションを有効にすると”(ダブルクォート), ‘(シングルクォート), `(バッククォート)の扱いが変わります。
1 : c : \ f o r t e s t > f o r / F " u s e b a c k q " % i I N ( " s a m p l e f i l e . t x t " ) D O @ e c h o % i
2 : h o g e
1 : c : \ f o r t e s t > f o r / F " u s e b a c k q " % i I N ' i p c o n f i g ' ) D O @ e c h o % i
2 : i p c o n f i g
3 :
4 : c : \ f o r t e s t > f o r / F " u s e b a c k q " % i I N ( ` i p c o n f i g ` ) D O @ e c h o % i
5 : W i n d o w s
6 : W i r e l e s s
7 : 接 続 固 有 の
8 : リ ン ク ロ ー カ ル
9 : I P v 4
1 0 : サ ブ ネ ッ ト
1 1 : デ フ ォ ル ト
1 2 : イ ー サ ネ ッ ト
1 3 : メ デ ィ ア の 状 態 .
1 4 : 接 続 固 有 の
1 5 : T u n n e l
1 6 : メ デ ィ ア の 状 態 .
1 7 : 接 続 固 有 の
1 8 : T u n n e l
1 9 : メ デ ィ ア の 状 態 .
2 0 : 接 続 固 有 の
2 1 : T u n n e l
2 2 : 接 続 固 有 の
2 3 : I P v 6
2 4 : リ ン ク ロ ー カ ル
2 5 : デ フ ォ ル ト
2 6 : T u n n e l
2 7 : メ デ ィ ア の 状 態 .
2 8 : 接 続 固 有 の
2 9 : T u n n e l
3 0 : メ デ ィ ア の 状 態 .
3 1 : 接 続 固 有 の
このように、usebackqオプションを有効にすると、ダブルクォートは文字列ではなくてファイル名として扱われます。シングルクオートはコマンドではなく文字列になり、バッククォートがコマンドになります。
変数を置換出来る機能も見ておきましょう。置換というか表現の変更といった方が近いかもしれません。
1 : c : \ f o r t e s t > f o r / F % i I N ( " " t e s t " " ) D O @ e c h o % i
2 : " t e s t "
3 :
4 : c : \ f o r t e s t > f o r / F % i I N ( " " t e s t " " ) D O @ e c h o % ~ i
5 : t e s t
変数名の前に~をつけると引用句(“)が削除されます。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % i
2 : s a m p l e f i l e . t x t
3 : s a m p l e . t x t
4 : s a m p l e 1 . t x t
5 : s a m p l e 1 0 . t x t
6 : s a m p l e 2 . t x t
7 : s a m p l e 3 . t x t
8 : s a m p l e 4 . t x t
9 : s a m p l e 5 . t x t
1 0 : s a m p l e 6 . t x t
1 1 : s a m p l e 7 . t x t
1 2 : s a m p l e 8 . t x t
1 3 : s a m p l e 9 . t x t
1 4 :
1 5 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ f i
1 6 : c : \ f o r t e s t \ s a m p l e f i l e . t x t
1 7 : c : \ f o r t e s t \ s a m p l e . t x t
1 8 : c : \ f o r t e s t \ s a m p l e 1 . t x t
1 9 : c : \ f o r t e s t \ s a m p l e 1 0 . t x t
2 0 : c : \ f o r t e s t \ s a m p l e 2 . t x t
2 1 : c : \ f o r t e s t \ s a m p l e 3 . t x t
2 2 : c : \ f o r t e s t \ s a m p l e 4 . t x t
2 3 : c : \ f o r t e s t \ s a m p l e 5 . t x t
2 4 : c : \ f o r t e s t \ s a m p l e 6 . t x t
2 5 : c : \ f o r t e s t \ s a m p l e 7 . t x t
2 6 : c : \ f o r t e s t \ s a m p l e 8 . t x t
2 7 : c : \ f o r t e s t \ s a m p l e 9 . t x t
変数名の前に~fをつけると絶対パスで表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ d i
2 : c :
3 : c :
4 : c :
5 : c :
6 : c :
7 : c :
8 : c :
9 : c :
1 0 : c :
1 1 : c :
1 2 : c :
1 3 : c :
変数名の前に~dをつけるとドライブ名のみ表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ p i
2 : \ f o r t e s t \
3 : \ f o r t e s t \
4 : \ f o r t e s t \
5 : \ f o r t e s t \
6 : \ f o r t e s t \
7 : \ f o r t e s t \
8 : \ f o r t e s t \
9 : \ f o r t e s t \
1 0 : \ f o r t e s t \
1 1 : \ f o r t e s t \
1 2 : \ f o r t e s t \
1 3 : \ f o r t e s t \
変数名の前に~pをつけるとパス名のみ表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ n i
2 : s a m p l e f i l e
3 : s a m p l e
4 : s a m p l e 1
5 : s a m p l e 1 0
6 : s a m p l e 2
7 : s a m p l e 3
8 : s a m p l e 4
9 : s a m p l e 5
1 0 : s a m p l e 6
1 1 : s a m p l e 7
1 2 : s a m p l e 8
1 3 : s a m p l e 9
変数名の前に~nをつけるとファイル名のみ表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ x i
2 : . t x t
3 : . t x t
4 : . t x t
5 : . t x t
6 : . t x t
7 : . t x t
8 : . t x t
9 : . t x t
1 0 : . t x t
1 1 : . t x t
1 2 : . t x t
1 3 : . t x t
変数名の前に~xをつけると拡張子のみ表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ s i
2 : c : \ f o r t e s t \ S A M P L E ~ 1 . T X T
3 : c : \ f o r t e s t \ s a m p l e . t x t
4 : c : \ f o r t e s t \ s a m p l e 1 . t x t
5 : c : \ f o r t e s t \ s a m p l e 1 0 . t x t
6 : c : \ f o r t e s t \ s a m p l e 2 . t x t
7 : c : \ f o r t e s t \ s a m p l e 3 . t x t
8 : c : \ f o r t e s t \ s a m p l e 4 . t x t
9 : c : \ f o r t e s t \ s a m p l e 5 . t x t
1 0 : c : \ f o r t e s t \ s a m p l e 6 . t x t
1 1 : c : \ f o r t e s t \ s a m p l e 7 . t x t
1 2 : c : \ f o r t e s t \ s a m p l e 8 . t x t
1 3 : c : \ f o r t e s t \ s a m p l e 9 . t x t
変数名の前に~sをつけると短い名前を表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ a i
変数名の前に~aをつけるとファイルの属性を表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ t i
2 : 2 0 1 2 / 0 3 / 1 6 0 0 : 0 0
3 : 2 0 1 2 / 0 3 / 1 5 2 3 : 5 1
4 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
5 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
6 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
7 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
8 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
9 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
1 0 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
1 1 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
1 2 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
1 3 : 2 0 1 2 / 0 3 / 1 5 2 1 : 5 5
変数名の前に~tをつけると日付/時刻を表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % ~ z i
2 : 7
3 : 1 0 7
4 : 1 0
5 : 1 1
6 : 1 0
7 : 1 0
8 : 1 0
9 : 1 0
1 0 : 1 0
1 1 : 1 0
1 2 : 1 0
1 3 : 1 0
変数名の前に~zをつけるとファイルのサイズを表示します。
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O e c h o % ~ $ P A T H : i
2 :
3 : c : \ f o r t e s t > e c h o
4 : E C H O は O N > で す 。
1 : c : \ f o r t e s t > s e t P a t h = % P a t h % ; c : \ f o r t e s t
2 :
3 : c : \ f o r t e s t > f o r % i I N . t x t ) D O e c h o % ~ $ P A T H : i
4 :
5 : c : \ f o r t e s t > e c h o c : \ f o r t e s t \ s a m p l e f i l e . t x t
6 : c : \ f o r t e s t \ s a m p l e f i l e . t x t
上記の例はかなりわかりにくいですが、環境変数PATHの中に記述されているディレクトリを探し、そこに検索結果のファイルやディレクトリが合致すれば表示される、そうでなければ空になる、という動きをします。PATHに含まれているファイル、ディレクトリなのかどうかの判定に使えると思います。
バッチファイルに記述する場合の注意# ここまでforを見てきましたが全て「コマンドプロンプト上で実行する際の記述」であることに注意してください。ヘルプにも以下の記載があります。
バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、%%変数を使用してください。
「コマンドプロンプトで動いたものをそのままバッチファイルに貼りつけてはいけない 」ということです。
具体的には以下の例であれば
1 : c : \ f o r t e s t > f o r % i I N . t x t ) D O @ e c h o % i
2 : s a m p l e f i l e . t x t
3 : s a m p l e . t x t
4 : s a m p l e 1 . t x t
5 : s a m p l e 1 0 . t x t
6 : s a m p l e 2 . t x t
7 : s a m p l e 3 . t x t
8 : s a m p l e 4 . t x t
9 : s a m p l e 5 . t x t
1 0 : s a m p l e 6 . t x t
1 1 : s a m p l e 7 . t x t
1 2 : s a m p l e 8 . t x t
1 3 : s a m p l e 9 . t x t
バッチファイルには以下の用に記述する必要があります。
1 : f o r % % i I N . t x t ) D O @ e c h o % % i
注意して下さい。
forの可能性# さて、ここまでforコマンドでできることを見てきました。「かなりの事ができる」ということがお分かりいただけたかと思います。「もういやだ」という人も多いかとは思いますが…。でも、バッチファイルを作るしか無いのであれば仕方が無いです……。
随分このエントリも長くなってしまいました。forを駆使した使える実例に関してはまた別のエントリで紹介したいと思います。