1

我正在尝试对结果使用for循环findstr。我想让 var6 成为上面 found string 的整个行Class=!var4!。我放了skip=-1但这不起作用(向后看一行)。

所以如果它看起来像这样:

Name=Bismark #14
Class=var4

我想要 var6 = Name=Bismarck #14

findstr /b "Class=!var4!" "PosTime_Campaign_SCR.mis"
if not errorlevel 1 (
for /f "skip=-1 delims=" %%L in ('findstr "Class=!var4!" PosTime_Campaign_SCR.mis') do (
if not errorlevel 1 (
set var6=!var6!%%L
)
)
)

我很接近,但我不知道如何告诉for循环在找到的findstr.

解决方案:

@echo off

set var4=BBBismarck

for /f "delims=" %%L in (PosTime_Campaign_SCR.mis) do (
if /i "%%L" equ "Class=%var4%" (
    goto endloop
)
set "var6=%%L"
)
    :endloop

echo %var6%
pause
4

2 回答 2

2

这将很难findstr用于这项工作。

我可以看到一种方法:使用该/N选项findstr写出行号,然后在另一个循环中使用该行号,在该循环中一次处理文件的一行并设置var6为上一行。

但是,如果您无论如何都要遍历文件中的每一行,则最好findstr完全跳过并进行自己的比较。或findstr在每一行上使用。

这是一些完全未经测试的代码来描述我的想象:

for /f %%L in (PosTime_Campaign_SCR.mis) do (
    if /i "%%L" equ "Class=%var4%" (
        goto endloop
    )
    set "var6=%%L"
)
:endloop

echo %var6%

我们在这里所做的是设置var6每一行,但是当我们到达我们想要的行时,我们会跳出循环。因此var6最终被设置为上一行的值。

于 2013-03-21T19:40:46.003 回答
0
(set var6=)
for /f "delims=" %%L in (PosTime_Campaign_SCR.mis) do IF NOT DEFINED var6 (
echo %%L | findstr "Class=!var4!" >nul
if not errorlevel 1 (set var6=!lastline!)
set lastline=%%L
)

...假设 Class=var4 永远不会出现在文件的第一行。

lastline保存读取的最后一行的内容。当 FINDSTR 检测到匹配行时,将 var6 设置为读取的前一行的内容,并且由于现在在环境中设置了 var6,因此不会重复检查,因此它将 var6 设置为第一个匹配行之前的行的内容.

如果您删除,IF NOT DEFINED var6则 var6 将设置为 LAST 匹配行之前的行的内容。

如果 var6 在执行后未定义,则没有匹配行。

于 2013-03-21T19:42:25.217 回答