バッチファイルで部分文字列を取得したり、置換したり文字列を操作する方法についてまとめる。

部分文字列を取得

基本的な書式は%var:~m,n%で変数varのm文字目からn文字を取得する。(mは0始まり)

その他にも以下のような書式がある。

書式 説明
%var:~m,n% 変数varのm文字目からn文字
%var:~m% 変数varのm文字目から末尾
%var:~m,-n% 変数varのm文字目から末尾のn文字を除いた文字列
%var:~-m% 変数varの末尾m文字
%var:~-m,n% 変数varの末尾m文字目からn文字
%var:~-m,-n% 変数varの末尾m文字目から末尾のn文字を除いた文字列
$ set name=sohtaro.com
$ echo %name:~3,4%
taro
$ echo %name:~3%
taro.com
$ echo %name:~3,-2%
taro.c
$ echo %name:~-3%
com
$ echo %name:~-3,1%
c
$  echo %name:~-3,-1%
co

mを省略したりnを省略したり-nで最後のn文字分を除いたりできるが基本はm,nだけでいいと思う。

詳細はコマンドプロンプトでset /?を実行すると確認できる。

文字列を置換

%var:s1=s2%で変数varのすべてのs1をs2に置換する。
削除する場合はs2をブランクにする。

$ set name=sohtaro.com
$ echo %name:soh=Sou%
Soutaro.com
$ echo %name:o=O%
sOhtarO.cOm
$ echo %name:soh=%
taro.com

指定の文字列を含むか判定

大文字小文字を区別しないで判定するには、元の文字列から指定の文字列を削除した文字列が元の文字列と異なるか判定する。異なる場合、含むと判定する。

大文字小文字を区別して判定するにはfindstrを使う。

# 大文字小文字を区別しない場合
$ set name=sohtaro.com
$ if not %name:taro=% == %name% (echo 含む) else (echo 含まない)
含む
$ if not %name:TARO=% == %name% (echo 含む) else (echo 含まない)
含む
$ if not %name:jiro=% == %name% (echo 含む) else (echo 含まない)
含まない

# 大文字小文字を区別する場合
$ echo %name% | findstr "taro" >NUL
$ if not ERRORLEVEL 1 (echo 含む) else (echo 含まない)
含む
$ echo %name% | findstr "Taro" >NUL
$ if not ERRORLEVEL 1 (echo 含む) else (echo 含まない)
含まない