Следующие результаты приведут к желаемому результату.
Не работает со специальными символами, такими как (!) И ("), убедитесь, что все данные правильно очищены.
:indexOf
setlocal ENABLEDELAYEDEXPANSION
set indexOf_StringPosition=0
set "indexOf_Var1=%~1"
set "indexOf_Var2=%~2"
set indexOf_Var3=%3
:indexOf_NoInitLabel
set indexOf_CurrentPosition=0
set "indexOf_StringTemp=!indexOf_Var1:*%indexOf_Var2%=!"
if "%indexOf_StringTemp%"=="%indexOf_Var1%" (
set indexOf_StringPosition=-1
goto :indexOf_BreakLabel
)
set "indexOf_StringTemp2=!indexOf_Var1:%indexOf_Var2%%indexOf_StringTemp%=!"
if "%indexOf_StringTemp2%"=="" (
set /a indexOf_CurrentPosition+=1
goto :indexOf_BreakLabel
)
:indexOf_LoopLabel
if "!indexOf_StringTemp2:~%indexOf_CurrentPosition%,1!"=="" (
set /a indexOf_CurrentPosition+=1
goto :indexOf_BreakLabel
)
set /a indexOf_CurrentPosition+=1
goto :indexOf_LoopLabel
:indexOf_BreakLabel
set /a indexOf_StringPosition+=%indexOf_CurrentPosition%
set /a indexOf_Var3-=1
set "indexOf_Var1=!indexOf_Var1:~%indexOf_CurrentPosition%!"
if "indexOf_Var1"=="" (
goto :indexOf_EndLabel
)
if "%indexOf_Var3%"=="0" (
goto :indexOf_EndLabel
)
goto :indexOf_NoInitLabel
:indexOf_EndLabel
(endlocal & set %4=%indexOf_StringPosition%)
goto :eof
indexOfможно назвать так:
@echo off
set "myString=barbarbarfoobarfoobarbar"
set "myMatch=bar"
set myMatchIndex=4
call :indexOf "%myString%" "%myMatch%" %myMatchIndex% position
echo Position is: %position%
pause
rem Position is: 13
Важное примечание: индекс алгоритма начинается с 1. Это означает, что «b» рассматривается как 1, «a» обрабатываетсякак 2 и т. д. Чтобы начать индекс с 0, добавьте следующее после :indexOf_EndLabel
:
if not %indexOf_StringPosition%==-1 set /a indexOf_StringPosition-=1