for loop skip =当值为变量时无法正常工作

时间:2013-03-22 20:27:54

标签: variables for-loop batch-file cmd options

我正在尝试跳过这些行,以便在此findstr命令下面的第二行抓取 var5

'findstr /x /v /c:"Ship sunk" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.clg" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.cfg"')

重复一遍,我想从下面第二行抓取 var5 ,其中findstr(上方)找到它的字符串。

所以我决定在for循环中为skip创建一个变量。我称之为“ skipnumber5 ”。但是,使用这个变量它会跳过我说的行数,但是它不会重复循环。因此,如果我设置skipnumber5 = 12,则它与“skip = 12”的行为不同。它正确地执行第一个循环,但随后它一次又一次地重复第一个循环结果。 使用skip = 12可以正常使用循环,但是我需要更改跳过值才能在变化时抓取 var5

代码:     set / a skipnumber5 = 0

:part5
set /a skipnumber5+=12
set /a maxlines5+=1
set /a linecount5=0

for /F "delims=" %%x in ('findstr /c:"Ship sunk" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\*.clg" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\Log_*.cfg"') do (
set /a linecount5+=1
set FileName5=
set FileName5=%%~nx
if !linecount5! GEQ %maxlines5% goto part5a 
)

:part5a
set /a maxlines5a+=1
set /a linecount5a=0
for /f "skip=%skipnumber5% tokens=2 delims==" %%E in ('findstr /x /v /c:"Ship sunk" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.clg" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.cfg"') do (
set /a linecount5a+=1
set var5=
set var5=!var5!%%E
set /a skipnumber5+=12
if !linecount5a! GEQ %maxlines5a% (goto part5b)
)

在for循环选项中,与变量 skipnumber5 相关的行是:

 for /f "skip=%skipnumber5% tokens=2 delims==" %%E in

问题是变量 skipnumber5 的跳过停留在同一个文件中,跳过。但是如果您阅读了代码,它应该更改为下一个 Filename5 ,跳过。如果skip = 1或任何整数,那就是它的工作原理。

那么为什么变量 skipnumber5 使skip =以这种方式行动?

1 个答案:

答案 0 :(得分:0)

使用findstr的一个例子,没有延迟扩展:

@echo off &setlocal
set "search=mysearch"
set "file=file.txt"

:: find first %search%
set "count="
for /f "tokens=1*delims=:" %%i in ('findstr /n "%search%" %file%') do if not defined count set /a count=%%i
echo pattern:  [%search%] found at line %count%
:: two lines down --> skip+1
set /a count+=1
set "variable="
set "found="
:: grab line+2
for /f "skip=%count%tokens=1*delims=:" %%i in ('findstr /n "^" %file%') do if not defined found set "found=%%i"&set "variable=%%j"
:: Note: you need %found% to find empty lines
echo variable: [%variable%] found at line %found%
endlocal

对于你的问题:你不能使用!变量!或者代码块中的循环变量为for parameter(delims,skip等),它在同一代码块中更改其值。