文字列の部分文字列を取得するサブルーチン

ウィンドウズのバッチファイル(.bat)で部分文字列を取得するには…

%変数名:~a,b%

で変数の中身の文字列の0から始まるインデックスa番目から、長さbの部分を切り出せるということは調べるとすぐわかります・・・
たとえば

>set x=abcdefg
>echo %x:~2,4%
cdef

しかし、上記のaとbが数字のリテラルでないと期待した結果になりません。たとえば、以下のように記述すると・・・

>set x=abcdefg
>set y=2
>set z=4
>echo %x:~%y%,%z%%
abcdefgy%,4%

setlocalコマンドにenabledelayedexpansionという引数を指定すると、環境変数の参照に
%環境変数%だけでなく、!環境変数!も使えるようになります。
そこで、他のプログラミング言語にあるような3つの引数をとる文字列の部分文字列を求めるサブルーチンを書いてみます。
GET_SUBSTR.bat

@echo off
setlocal enabledelayedexpansion
call :GET_SUBSTR %*
echo %substr%
endlocal
goto :EOF

::部分文字列を取得する 
::使用法 call :GET_SUBSTR (文字列) (開始インデックス) (部分文字列の長さ)
:GET_SUBSTR
set str=%1
set startIndex=%2
set length=%3
::setlocalでenabledelayedexpansionを宣言しているので以下の記述が可能。
set substr=!str:~%startIndex%,%length%!
exit /b

GET_SUBSTR.batのあるディレクトリで以下のように動作確認できます。実際にはbatの他の箇所で使用します。

>GET_SUBSTR.bat abcdefg 2 4
cdef