【问题标题】:for loop skip= not working correctly when its value is a variable当其值为变量时,for loop skip= 无法正常工作
【发布时间】:2013-03-22 20:27:53
【问题描述】:

我正在尝试跳过行以便在此 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"')

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

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

代码: 设置 /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= 以这种方式运行?

【问题讨论】:

  • 对您关于%skipnumber5%的问题进行了编辑。

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


【解决方案1】:

一个使用 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

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

【讨论】:

  • 您将 %count% 变量放入了 skip。什么是代码块?你的在不同的代码块中吗?
  • 我让它工作了。现在我需要循环它,所以对于同一个文件中找到的每个 str,它会告诉我它下面的 2 行是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多