Windowsのバッチファイル(*.bat)で文字列を分割する方法を検証しましたので、ここにメモしておきます。
JAVAやPHPで言うところのSplit関数みたいなことがWindowsバッチでしたくて調べたところ、For文を使って文字列を分割する方法を見つけました。
For文を使って文字列を分割する
WindowsバッチのFor文には、文字列やファイルなどを読み込んで処理したり、フォルダを検索するのに利用できるようです。
今回は文字列やファイルの中身を読み込んで、区切り文字で分割する方法を検証します。
forコマンドの構文
for /f "トークンオプション" 処理結果 in (処理対象) do コマンド
トークンオプション
- tokens:何番目の値を取得するか
- delims:トークの区切り文字を指定
- skip:先頭から指定した行数をスキップする
- eol:指定した文字から始まる行を無視する
- usebackq:バッククォート(`)で囲まれた文字列をコマンドとして実行す
処理結果
- %% + (アルファベット)で指定
- 処理結果が複数ある場合はアルファベット順で取得できる
処理対象
- 対象がファイル:ファイル名、パスを指定
- 対象が文字列:ダブルクォーテーションで囲った文字か、変数を%で囲って指定
サンプルソース
sample2-1.bat:
@echo off
set moji="test sample 1 10"
rem すべての引数をスペースで分割
for /f "tokens=2 delims= " %%a in (%moji%) do echo %%a
結果:
c:\sample\bat\arguments>sample2-1.bat
sample
スペースを含む文字列「test sample 1 10」をforコマンドを使って分割するサンプルです。
トークンで「tokens=2」、「delims= 」としており、区切り文字がスペースで且つ分割した文字の2番目の値を取得するように指定しています。
sample2-2.bat:
@echo off
set moji="test sample 1 10"
rem すべての引数をスペースで分割
for /f "tokens=1-4 delims= " %%a in (%moji%) do (
echo %%a
echo ----------
echo %%b
echo ----------
echo %%c
echo ----------
結果:
c:\sample\bat\arguments>sample2-2.bat
test
----------
sample
----------
1
----------
10
今度は分割した文字の4つすべて取得するサンプルになります。
処理結果は「%% + (アルファベット)」の形式で取得することができます。「%%a」と指定すると、分割した文字列がアルファベット順に「%%a、%%b、%%c、%%d」と自動で割り振られて代入されます。
分割する対象は文字列だけでなく、ファイルの中身を指定することも可能です。
sample2-3.bat:
@echo off
for /f "tokens=1-4 delims=:, " %%a in (sample2-3.txt) do (
echo %%a
echo --
echo %%b
echo --
echo %%c
echo --
echo %%d
echo ----------
)
sample2-3.txt:
a,b,c,d,e
1 2 3 4 5
あ:い:う:え:お
結果:
c:\sample\bat\arguments>sample2-3.bat
a
--
b
--
c
--
d
----------
1
--
2
--
3
--
4
----------
あ
--
い
--
う
--
え
----------
区切り文字を「:」、「,」、スペースの3つを指定し、sample2-3.txtのファイルを読み込んで最初の行から文字を読み込んで分割しているのが分かるかと思います。
以上です。