有for循环引用findstr结果,向下移动两行以获取变量

时间:2013-03-22 04:57:43

标签: batch-file cmd

我有两个代码但是part5正在使用与part4不同的文件中的错误变量。

part4使用var4,part5使用var5。我希望var5被抓下2行“skip = 2 tokens = 2 delims ==”但由于某种原因,我在参考part5中的findstr时不能跳过行。第5部分是需要改变的,第4部分是好的。

所以在本质上,我如何让part5在part4的findstr下面获取两行变量?

SETLOCAL ENABLEDELAYEDEXPANSION

:part4
set var4=
findstr /m "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"
if not errorlevel 1 (
for /f "tokens=4 delims==,|" %%D in ('findstr "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 var4=!var4!%%D
 goto :eof
)
)

:part5
findstr "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"
if not errorlevel 1 (
for /f "skip=2 tokens=2 delims==" %%E in ('findstr "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 var5=
set var5=!var5!%%E
goto :eof
)
)

示例:

如果part4发现“船沉没!”在这个文件中(Ship sunk!在第一行):

asdfasfdasdfShip sunk! asdfjaslkjf;ajfa;
aksdfjklasjflk; fnwerawra
Date=19400112

我想将part5变为19400112(“Date =”之后的第三行)。 “Date =”在part4变量

之下的两行之后的部分

1 个答案:

答案 0 :(得分:0)

虽然我不完全理解您的代码,但我可以在其上看到这些细节:

  • 在第4部分中,首先执行findstr只是为了知道目标文本是否存在于文件中,然后再次执行以获取某些数据(我无法理解什么数据是这个)。您可以只执行一次findstr来完成这两项任务。

  • 你说你想要part5在part4的findstr 下面的两行中获取一行,但是你没有以任何方式连接part5中part4的结果!第5部分中的"skip=2与part4的findstr无关(skip = 2相对于什么?默认是第一行)。您需要从part4获取行号,然后在第5部分中使用它作为“skip =”,并使用额外的“+2行”,即“+1 skip”。

下面的批处理文件在您的示例数据文件上实现此过程:

@echo off
:part4
set var4=
rem Get the LINE NUMBER where the findstr happen
for /f "tokens=1 delims=:" %%D in ('findstr /N "Ship sunk!" "inputFile.txt"') do (
   set var4=%%D
)
:part5
rem Get the number of two lines below (that is, skip=line+1)
set /A skip=var4+1
rem If text found in part4
if defined var4 (
   rem Get that line from the file (NOT from findstr)
   for /f "skip=%skip% tokens=2 delims==" %%E in (inputFile.txt) do (
      set var5=%%E
      goto continue
   )
)
:continue
echo %var5%

安东尼奥