批处理文件 - 如何在循环浏览多个文本文件时获取关键字并在检测到关键字后执行操作 (IF)



我尝试在循环访问文件夹内的多个文本文件(逐行读取文本文件)时使用文本文件内的关键字执行操作(IF 语句)。我能够循环浏览多个文本文件。但是我只得到最后一个文本文件关键字。我不知道为什么会这样。我的预期结果是我能够获取文本文件中的每个关键字,当检测到关键字时,它将执行 IF 语句,在 IF 语句之后,它将继续循环遍历其他文本文件并寻找另一个关键字。

例如。Log_DP_123.txt内容。

ERROR-D12345678

例如。Log_DP_124.txt内容。

DisConnected

我的代码:

@echo on
SETLOCAL EnableDelayedExpansion
for %%x in (C:testScriptlogsCOBlog_DP_*.txt
) do for /f "usebackq delims=" %%a in ("%%~fx") do SET e=%%a
echo %e%
SET x=%e%
SET s=!x:~0,5!
SET date=!x:~6,14!
SET !d!
SET !s!
pause
IF "%s%" == "DisCo" (
(
echo disconnected
)
IF "%s%" == "ERROR" (
echo Sucess
echo %s%
echo %date%
)
)>C:Users310152922DesktopMohit_TaskAutomatedScriptCOBsucess.txt
pause

我需要进行任何更改才能达到预期结果?

预期结果 - 成功时.txt它将列出所有回显。例如。内容里面成功.txt。

Sucess
Error
12345678
disconnected

感谢您的查看,评论和回答。

虽然我接受的答案与Post不同。但我发现Aacini提供的方法简单,易于理解,对我非常有用。所以我接受了这个答案。附言如果你在寻找这个帖子答案,它应该是德本汉姆的答案!

怕我不明白你的代码试图做什么。当你寻求帮助时,你总是应该用语言解释代码应该做什么;否则,我们如何为您提供帮助?例如,根据您的代码,您似乎并不关心关键字出现在哪个文件中(您从不显示 %%x 的值)。

无论如何,如果您想搜索多个文件以"DisCo"或"ERROR"字符串开头的行,那么以下命令可以做到这一点:

findstr /B "DisCo ERROR" C:testScriptlogsCOBlog_DP_*.txt

此命令显示匹配的行以及一些附加信息(如文件名),但您可以使用for命令处理这些行,该命令将冒号作为分隔符。

我希望它有帮助...

编辑

我采用了以前的findstr命令并将其插入到您的代码中,但相应地对其进行了修改:

@echo off
setlocal EnableDelayedExpansion
for /F "tokens=2 delims=:" %%e in ('findstr /B "DisCo ERROR" log_DP_*.txt') do (
   REM echo %%e
   SET x=%%e
   SET s=!x:~0,5!
   SET ddate=!x:~7,14!
   IF "!s!" == "DisCo" (
      echo disconnected
   ) else (
      echo Sucess
      echo !s!
      echo !ddate!
   )
)

例如。Log_DP_123.txt内容:

Any other line
ERROR-D12345678
Any other line

例如。Log_DP_124.txt内容:

Any other line
Any other line
DisConnected
Any other line

输出:

Sucess
ERROR
12345678
disconnected

同意 - 括号看起来不平衡。这可能会导致奇怪的问题。缩进是执行目视检查的好方法;每次打开一对新的括号并将右括号与导致打开一对的关键字(如 for)对齐时,要缩进一个或两个空格。

在块语句中(a parenthesised series of statements) delayedexpansion模式(您已调用),则%var%解析为解析最外层 for 时的变量值。 !var!解析为运行时值,即它在块中更改时的当前值。

因此,在块中,%e%将表示"e的原始值" - 即未设置,因此为空。将其替换为 !e! 以获取所需的运行时值。

并且您勇敢地尝试调试的set !s!将被解析为set Disco(或者如果当时s设置为 Disco )。 SET显示与给定的参数匹配或开始的任何变量的运行时值 - 因此,如果s设置为 Disco ,则set !s!将显示从 Disco 开始的环境变量的值,而set s将显示所有从 s 开始的环境变量的值。

下一个小问题 - 可能更多供将来参考 - DATE是一个返回当前日期的魔术值。如果您像 yu 一样通过将其设置为一个值来覆盖它,则将返回值。

最后 - 请使用有意义的名称。当然,se很容易输入,但很容易与%%e混淆%e% - 尤其是在连接字符串时。

您的括号放错了位置。我想你可能的意思是这样做:

@echo on
SETLOCAL EnableDelayedExpansion
for %%x in (C:testScriptlogsCOBlog_DP_*.txt) DO (
    for /f "usebackq delims=" %%a in ("%%~fx") DO (
        SET e=%%a
        echo %e%
        SET x=%e%
        SET s=!x:~0,5!
        SET date=!x:~6,14!
        SET !d!
        SET !s!
        pause
        IF "%s%" == "DisCo" (
            echo disconnected
        )
        IF "%s%" == "ERROR" (
            echo Sucess
            echo %s%
            echo %date%
        )
    )
)

> Magoo在他的回答中提出了很好的观点,所以我不会重复它们。

我相信以下是你试图实现的逻辑。请注意,在括号内缩进行会使逻辑更易于理解。

echo(!part2!是打印出变量值的安全方法,即使该值为空或仅包含空格也是如此。它看起来像不平衡的括号,但事实并非如此。一个简单的echo !part2!如果值为空或仅空格,则会打印出ECHO is off.

@echo off
setlocal EnableDelayedExpansion
(
  for %%x in (
    C:testScriptlogsCOBlog_DP_*.txt
  ) do for /f "usebackq delims=" %%a in ("%%~fx") do (
    set "str=%%a"
    set "part1=!str:~0,5!"
    set "part2=!str:~6,14!"
    ( REM Presumably, these are debug statements that should
      REM not be included in the output file.
      REM So the output is directed to stderr
        echo str=!str!
        echo part1=!part1!
        echo part2=!part2!
    )>&2
    if "!part1!" == "DisCo" echo diconnected
    if "!part1!" == "ERROR" (
      echo Sucess
      echo(!part1!
      echo(!part2!
    )
  )
)>"C:Users310152922DesktopMohit_TaskAutomatedScriptCOBsucess.txt"

相关内容

最新更新