пакетная итерация строки с пробелом, найти слово, содержащее подстроку - PullRequest
0 голосов
/ 02 мая 2018

Я не понимаю, почему это не работает

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set contents=sdflkm efsdf sdfkns CRQ239478239
for /f "tokens=1* delims= " %%i in ("%contents%") do (
  set str=%%i
  echo str: !str:~0,3!
    if "!str:~0,3!"=="CRQ" (
      set revision=!str!
    )
)
echo revision: %revision%

Я хочу извлечь слово из строки, которая начинается с "CRQ". Но этот цикл for выполняет только одну итерацию, захватывая первые 3 буквы строки. Выход просто str: sdf. Он должен проверять первые 3 буквы каждого слова в строке, и если первые 3 буквы являются «CRQ», он должен установить переменную ревизии на слово, содержащее CRQ. Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Просто измените ваш For /F цикл на стандартный For цикл:

@Echo Off
SetLocal EnableDelayedExpansion
Set "Contents=sdflkm efsdf sdfkns CRQ239478239"
Set "Revision="
For %%A In (%Contents%) Do (Set "Str=%%A"
    Echo Str: !Str:~,3!
    If /I "!Str:~,3!"=="CRQ" Set "Revision=!Str!")
Set "Str="
If Defined Revision Echo %Revision%
Pause
0 голосов
/ 03 мая 2018

Измените свой for на простой и используйте %contents% без кавычек.

for %%i in (%contents%) do (

Просто еще один вариант с вызовом и смещением аргументов:

@echo off & SETLOCAL
set contents=sdflkm efsdf sdfkns CRQ239478239
Call :Sub %contents%
echo revision: %revision%
goto :eof
:sub
set str=%1
echo str: %str:~0,3%
if "%str:~0,3%"=="CRQ" set revision=%str%
If "%~2" neq "" (shift & goto :sub)
0 голосов
/ 03 мая 2018

Команда 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...