我不明白为什么这不起作用
@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的单词。我该怎么做?
答案 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"
)