Windowsバッチ(.bat)で文字列の切り出しを行う(Substrみたいな)

Windowsバッチの中で、文字列を、切り出したりしたいことってありますよね。

その他多くのプログラミング言語ではSubstr()という関数が用意されている機能です。

もちろんWindowsバッチでも出来ますが、少し記述の仕方が変わっているので、まとめておきます。

文字列置換も出来ますので、それについては、以下の記事を参考にしてください。

Windowsのコマンドプロンプトやバッチ内で文字列置換を簡単な記述で行うWindowsのコマンドプロンプトやバッチ内で文字列置換を簡単な記述で行う

batのsubstr()の基本的な構文

基本的な構文は、

%[変数名]:~[開始位置],[文字数]%

のようになります。一覧にすると、以下のような感じですね。

ちなみに、開始位置の「m」は0から始まる数字で、文字の先頭から取得する場合は「0」となることに注意してください。

また、全角の場合は、全角一文字が1文字としてカウントされます。

%STR%変数STRの値全体
%STR:~m%m文字目から、最後まで
%STR:~m,n%m文字目から、n文字分
%STR:~m,-n%m文字目から、最後のn文字分を除いたもの
%STR:~-m%後ろからm文字目から、最後まで
%STR:~-m,n%後ろからm文字目から、n文字分
%STR:~-m,-n%後ろからm文字目から、最後のn文字分を除いたもの

「m」で開始位置を指定していますが、プラスなら前から、マイナスが付けば後ろから数えた開始位置の指定になります。

さらに、「n」の文字数が付けば、開始位置からその文字数分切り出されます。指定が無ければ最後までということですね。

コピペで使えるサンプルソース

実際に試せるソースを載せておきますね。

@ECHO OFF
REM +--------------------------------------------------------------------+
REM | DESCRIPTION: | このバッチの説明
REM +--------------+-----------------------------------------------------+

REM 変数設定
SET str1=abcdefghijklmn
SET str2=あいうえおかきくけこ

REM このバッチが存在するフォルダに移動し、そこを基点にする
REM cd /d %~dp0
pushd %~dp0
cls

REM 処理
ECHO ★もともとの文字列
ECHO %str1%
ECHO %str2%
ECHO ----------------------------------

ECHO □2文字目から2文字分
ECHO %str1:~1,2%
ECHO %str2:~1,2%
ECHO ----------------------------------

ECHO ★【文字数】の指定を省略すると最後まで
ECHO □4文字目から最後まで
ECHO %str1:~3%
ECHO %str2:~3%
ECHO ----------------------------------

ECHO ★【開始位置】にマイナスを指定すると、後ろからの位置指定
ECHO □後ろから3文字目から最後まで
ECHO %str1:~-3%
ECHO %str2:~-3%
ECHO ----------------------------------

ECHO 【文字数】にマイナスを指定すると、除外する長さの指定(後ろから)になる
ECHO □4文字目から最後の一文字手前まで
ECHO %str1:~3,-1%
ECHO %str2:~3,-1%
ECHO ----------------------------------

REM PAUSE
EXIT /b

上記のバッチを実行すると、以下のような実行結果になります。