我尝试在循环访问文件夹内的多个文本文件(逐行读取文本文件)时使用文本文件内的关键字执行操作(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 一样通过将其设置为一个值来覆盖它,则将返回该值。
最后 - 请使用有意义的名称。当然,s
和e
很容易输入,但很容易与%%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"