Команда for
будет проходить через строки ввода. Поскольку ваша строка состоит только из одной строки, вы получаете только 1 итерацию в цикле.
Цикл for
разбивает эту одну строку на несколько токенов. Он передает первый токен в %i
, затем, благодаря звездочке в tokens=1*
, он помещает остаток в %j
. Если вы немного измените свой сценарий, вы увидите следующее:
set contents=sdflkm efsdf sdfkns CRQ239478239
for /f "tokens=1*" %%i in ("%contents%") do (
set str=%%i
echo str: !str:~0,3!
echo rest: %%j
if "!str:~0,3!"=="CRQ" (
set revision=!str!
)
)
echo revision: %revision%
который выводит:
str: sdf
rest: efsdf sdfkns CRQ239478239
revisionx:
Мое решение состоит в том, чтобы создать подпрограмму, которую вы можете рекурсивно вызывать на оставшихся токенах, пока не достигнете нужного:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set contents=sdflkm efsdf sdfkns CRQ239478239
call :ParseTokens %contents%
echo revision: %revision%
rem Subroutine ParseTokens
:ParseTokens
set ToParse=%*
for /f "tokens=1*" %%i in ("%ToParse%") do (
set str=%%i
if "!str:~0,3!"=="CRQ" (
set revision=!str!
exit /b
) else (
call :ParseTokens %%j
)
)
exit /b