我已经有一个批处理脚本来搜索文本文件中的一个字符串,如果在文件中找到字符串,则通过电子邮件发送该文件。
现在我要搜索两个单词。如果找到两个字符串中的任何一个,则应发送电子邮件。
我正在使用以下脚本,但即使找不到这两个单词,也会发送电子邮件。
echo on
setlocal
sqlcmd -S admin\SQLEXPRESS -E -i C:\Process.sql >status.txt
set eMail=mailid@domain.com
set server=-server servername.domain.com
find "FAILED" status.txt && find "Slow" status.txt
if %errorlevel% == 0 (
blat status.txt -to %eMail% -f from -s "Text Found" %server%
)
如何在文本文件中搜索两个字符串并对使用批处理脚本找到的两个字符串中的任何一个进行操作?
答案 0 :(得分:0)
使用标准的Windows控制台应用程序findstr
,可以在与OR表达式结合的行中指定要查找的多个字符串,即如果找到包含一个的行,则退出代码为0
要查找的字符串,否则findstr
的退出代码为1
。
@echo off
setlocal
sqlcmd.exe -S admin\SQLEXPRESS -E -i C:\Process.sql >"%Temp%\status.txt"
set "eMail=mailid@domain.com"
set "server=-server servername.domain.com"
%SystemRoot%\System32\findstr.exe /L /C:FAILED /C:Slow "%Temp%\status.txt" >nul
if not errorlevel 1 blat.exe "%Temp%\status.txt" -to %eMail% -f from -s "Text Found" %server%
del "%Temp%\status.txt"
endlocal
打开命令提示符窗口并运行findstr /?
以获得此控制台应用程序的帮助。
/L
指定搜索字符串应解释为文字,而不是因为缺少选项/I
而区分为正则表达式字符串。
使用/C:String
或/C:"Another String"
可以在文件名之前的命令行中指定要搜索的一个或多个字符串。
另请参阅Microsoft支持文章Testing for a Specific Error Level in Batch Files。
对于<--FAILED-->
和<--SLOW-->
作为在评论中写入的搜索字符串,有必要将两个搜索字符串括在双引号中,因为<
和>
被解释为重定向运算符,如果没有用双引号字符串括起来。
%SystemRoot%\System32\findstr.exe /L /C:"<--FAILED-->" /C:"<--SLOW-->" "%Temp%\status.txt" >nul
在命令提示符窗口cmd /?
中运行的最后一个帮助页面输出的最后一段列出了目录或文件名中的所有字符,这些字符要求将名称括在空格和&()[]{}^=;!'+,`~
的双引号中。对于其他参数字符串,此要求通常也是如此,因此必须将redirection operators |
和<
以及>
添加到需要用双引号括起来的列表中。重定向运算符不能用于目录/文件名。因此,它们未列在cmd.exe
的上一个帮助页面的最后一段中,该页面属于上面关于目录/文件名完成的段落。
答案 1 :(得分:0)
仅当status.txt中存在BOTH条款时才使用find "FAILED" status.txt && find "Slow" status.txt
发送邮件。
如果status.txt中存在EITHER术语(或两个术语),请使用find "FAILED" status.txt || find "Slow" status.txt
发送邮件。
现在你的脚本的方式,如果两个术语都不存在,它不应该发送邮件。如果是,则status.txt中存在任何一个术语,或者您发布的内容并不完全是您测试的内容。