带通配符或大于 "X" 次的 findstr

Findstr with wild card or greater than "X" Time

正在尝试将一个批处理文件放在一起,以便在文本文件中找到一个字符串。唯一的障碍是我想找到晚上 (PM) 而不是早上 (AM) 的值。

我正在尝试查找 "XBR Upload successful",但前提是存在于 PM 中:

从日志文件中提取: [3:35:07AM] XBR 上传成功。

我有以下内容:

@echo off
findstr /M "[*PM] XBR Upload successful." C:\Test.log
if errorlevel = 1 GOTO NOMATCH
if errorlevel = 2 GOTO MATCH

通配符 * 似乎对我不起作用。似乎找到了 [*PM],即使在日志文件中还没有 PM 计时。

感谢任何指导!

你应该这样尝试:

@echo off
Set InputFile=c:\Test.log
Set OutPutFile=c:\LogFile.txt
Type "%InPutFile%" |findstr /M /R /C:"\[.*PM\] XBR Upload successful." > %OutPutFile%  
If "%Errorlevel%" EQU "1" GOTO :NOMATCH
If "%Errorlevel%" EQU "0" GOTO :MATCH

:MATCH
Color 0A
echo MATCH
pause
Start "" %OutPutFile% 
Exit /b

:NOMATCH
Color 0C
echo NO MATCH
pause
Exit /b

您的代码无法按预期运行,因为您误解了 * 在正则表达式中的作用。通常是量词,不是通配符。

表达式x*表示"match 0 or more x characters"。但是你的情况有点特殊,因为 * 出现在方括号内,所以它被解释为字符 class。 [*] 匹配 * 文字字符。

你想要的表达方式是\[.*]
. 是通配符,\[ 进行了转义,因此它是文字而不是字符的开头 class.

此外,如果您的搜索字符串包含空格,则必须使用 /C 选项。由于您正在执行正则表达式,因此您还需要 /R 选项来覆盖 /C 字符串文字解释行为。

findstr /R /C:"\[.*PM] XBR Upload successful." C:\Test.log >nul && goto Match || goto NoMatch

但正如其他人所指出的,您可以通过不使用任何通配符的更简单的字符串文字搜索来逃脱。

findstr /C:"PM] XBR Upload successful." C:\Test.log >nul && goto Match || goto NoMatch