もう少し本格的に strstr()もどきを作る。
機能:%1から%2に一致する部分を探す。
%1:検索被対象文字列
%2:検索文字列
戻り値:ERRORLEVEL に検索結果を残す。
0以上なら見つかった位置の Offset。
負なら見つからなかった。
:strstr if "%~1" EQU "" exit /b -1 引数が空ならエラー if "%~2" EQU "" exit /b -2 で終わり。 set s1=%~1 set s2=%~2 set p1=0 %1の参照ポインタ set p2=0 %2の参照ポインタ :L1 if /I "!s1:~%p1%,1!" NEQ "!s2:~%p2%,1!" ( set p2=0 不一致なら%2は先頭へリセットしておく。 ) else ( set /A p2+=1 ) set /A p1+=1 if "!s2:~%p2%,1!" EQU "" ( set /A p1-=p2 一致した先頭位置を求めて exit /b !p1! 終わる。 ) if "!s1:~%p1%,1!" EQU "" exit /b -3 被対象の終わりまで来たら不一致。 goto :L1
1文字ずつ比較してどちらかの終端まで繰り返す。
if に /I を付けているので英字の大小は問わない。
呼び出しを書けばこんな感じ。
@echo off setlocal EnableExtensions setlocal EnableDelayedExpansion call :strstr %1 %2 echo ERRORLEVEL=%ERRORLEVEL% if ERRORLEVEL 0 ( echo %ERRORLEVEL% 文字目で一致しました。 ) endlocal exit /b
> hoge.cmd "01234abc89" ABd ERRORLEVEL=-3 > hoge.cmd "01234abc89" AB ERRORLEVEL=5 5 文字目で一致しました。
良さそうだ。