我从 PRTG 状态监视器创建了一个 XML 文件。此 XML 文件中的值 >4< 表示警告,>5< 表示错误。
使用findstr
和if 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