findstr 2 个参数和 2 个事件

findstr 2 个参数和 2 个事件

我从 PRTG 状态监视器创建了一个 XML 文件。此 XML 文件中的值 >4< 表示警告,>5< 表示错误。

使用findstrif errorlevel我只能检查其中一个值是真还是假,但我想检查两个值。

要实现的目标是:

  • 当 XML 文件中仅有 >4< 时,串行字符串“warning_found”将发送到 COM 端口。
  • 当 XML 文件中仅有 >5< 时,串行字符串“error_found”将发送到 COM 端口。
  • 当 >4< 和 >5< 在 XML 文件中时,串行字符串“error_found”将发送到 COM 端口。
  • 当 XML 文件中均不存在这两个值时,将向 COM 端口发送串行字符串“noerrord”。

目前我有一个仅包含 2 个变量的功能批处理文件 => error 和 noerror(见下文),但我也想实现警告参数:

@echo off
setlocal enableextensions enabledelayedexpansion
del %temp%\tmp.xml>nul 2>&1

::Init Variables
set url="http://127.0.0.1/api/table.xml"
set parameter="content=sensors&columns=status&username=wey&passhash=3085906047"
set com=COM3
set baud=9600
set parity=n
set data=8

::Read XML
curl.exe --data %parameter% %url% > %temp%\tmp.xml

::Init COM Port
mode %com% BAUD=%baud% PARITY=%parity% DATA=%data%

::Check for errors in xml
findstr /C:">5<" %temp%\tmp.xml
if errorlevel 1 goto noerror
goto error

:error
echo Error found
echo %* > %com%
echo fehler > %com%
goto end

:noerror
echo No error found
echo behoben > %com%
goto end

:end
del %temp%\tmp.xml>nul 2>&1
endlocal 
exit

XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
  <sensors totalcount="528" listend="0">
   <prtg-version>19.2.50.2842</prtg-version>
   </item>
   <item>
    <status>OK </status>
    <status_raw>3</status_raw>
   </item>
   <item>
    <status>OK </status>
    <status_raw>3</status_raw>
   </item>
   <item>
    <status>OK </status>
    <status_raw>3</status_raw>
   </item>
   <item>
    <status>OK </status>
    <status_raw>3</status_raw>
   </item>
   <item>
    <status>Fehler </status>
    <status_raw>5</status_raw>
   </item>
   <item>
    <status>Fehler </status>
    <status_raw>5</status_raw>
   </item>
   <item>
    <status>Pausiert (Pausiert durch überg. Objekt)</status>
    <status_raw>7</status_raw>
   </item>
   <item>
    <status>Pausiert (pausiert)</status>
    <status_raw>7</status_raw>
   </item>
   <item>
    <status>Pausiert (Pausiert durch überg. Objekt)</status>
    <status_raw>7</status_raw>
   </item>
   <item>
    <status>Pausiert (Pausiert durch überg. Objekt)</status>
    <status_raw>7</status_raw>
   </item>
   <item>
    <status>Pausiert (pausiert)</status>
    <status_raw>7</status_raw>
   </item>
  </sensors>

答案1

@echo off
setlocal enableextensions enabledelayedexpansion
del %temp%\tmp.xml>nul 2>&1

::Init Variables
set url="http://127.0.0.1/api/table.xml"
set parameter="content=sensors&columns=status&username=wey&passhash=3085906047"
set com=COM3
set baud=9600
set parity=n
set data=8

::Read XML
curl.exe --data %parameter% %url% >%temp%\tmp.xml

::Init COM Port
mode %com% BAUD=%baud% PARITY=%parity% DATA=%data%

2>nul findstr "\<4\>" "%tmp%\tmp.xml" >nul && (
2>nul findstr "\<5\>" "%tmp%\tmp.xml" >nul && (
goto error ) || goto warning ) || goto noerror

:noerror
echo=No error found: 4 and 5 not found
echo=behoben > %com%
goto end

:error
echo=Error found: 4 and 5 was found
echo=%* > %com%
echo=fehler > %com%
goto end

:warning
echo=Warning: only 4 was found
echo=behoben > %com%
goto end

:end
2>nul del /q /f %tmp%\tmp.xml >nul
endlocal 
exit

您可以使用findstr来搜索>4<,并将 运算符一起使用&&,当找到 时,也>5<转到:error,以及 运算符||,当未找到 时,转到:warning,因为只>4<找到了 。

  • 这将处理以下情况:
case: >4< only goto warning
case: >5< only goto error
case: >4< & >5< both goto error
  • >4<对于既未找到也未>5<找到 的情况,则goto's均未执行任何操作,则goto noerror
goto :error ) || goto :warning ) || goto noerror

  • 对于下一行/命令也是下一个语句的情况,您可以将其删除,它将以相同的方式执行:
goto :error ) || goto :warning )  || goto noerror 

:noerror
echo=No error found: 4 and 5 not found
echo=behoben > %com%
goto end

:warning
echo=Warning: only 4 was found
echo=behoben > %com%
goto end

:end
2>nul del /q /f %tmp%\tmp.xml >nul
endlocal 
exit

答案2

非常感谢您的解决方案。我设法实现了相同的目标,但没有您做得那么优雅。

 @echo off
setlocal enableextensions enabledelayedexpansion
del %temp%\tmp.xml>nul 2>&1

::Init Variables
set url="http://127.0.0.1/api/table.xml"
set parameter="content=sensors&columns=status&username=wey&passhash=2476365312"
set com=COM4
set baud=9600
set parity=n
set data=8

::Read XML
curl.exe --data %parameter% %url% > %temp%\tmp.xml

::Init COM Port
mode %com% BAUD=%baud% PARITY=%parity% DATA=%data%

::Check for warnings and error in xml
findstr ">4< >5<" %temp%\tmp.xml
if errorlevel 1 goto noerror
goto Check_for_warnings_in_xml

:Check_for_warnings_in_xml
findstr /C:">5<" %temp%\tmp.xml
if errorlevel 1 goto warning
goto error

:warning
start "" "C:/curl/curl.exe" -d "off" http://10.20.0.20/api/prtg_alarm
start "" "C:/curl/curl.exe" -d "on" http://10.20.0.20/api/prtg_warning
echo Warning found
echo warning_found > %com%
goto end

:error
start "" "C:/curl/curl.exe" -d "off" http://10.20.0.20/api/prtg_warning
start "" "C:/curl/curl.exe" -d "on" http://10.20.0.20/api/prtg_alarm
echo Error found
echo error_found > %com%
goto end

:noerror
start "" "C:/curl/curl.exe" -d "off" http://10.20.0.20/api/prtg_alarm
start "" "C:/curl/curl.exe" -d "off" http://10.20.0.20/api/prtg_warning
echo No error found
echo no_error > %com%
goto end

:end
del %temp%\tmp.xml>nul 2>&1
endlocal
exit

相关内容