批量迭代带有空格分隔符的字符串,查找包含子字符串的单词

时间:2018-05-02 20:54:43

标签: windows batch-file

我不明白为什么这不起作用

@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的单词。我该怎么做?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

只需将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

答案 2 :(得分:1)

将您的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)

答案 3 :(得分:0)

只需添加另一种方法来实现此目的,即使用名为My CRQs.txt的文件作为输入 这里的想法是将每个字符串分解成单词,这样findstr只会返回您要求的字符串。

@echo off
for /f "usebackq delims=" %%i in ("My CRQs.txt") do (
   for %%a in (%%i) do echo %%a | findstr /IBRC:"CRQ"
)