批处理文件ErrorLevel困扰

时间:2011-04-18 12:19:37

标签: batch-file

我正在编写批处理文件来升级某些系统。我需要从xml文件中解析一个日期并将其保存以供稍后在文件中使用。日期格式为yyyy \ MM \ dd。

到目前为止我所拥有的是:

@echo off    
setLocal DisableDelayedExpansion    
for /f "tokens=* delims= " %%G in (ConnectionManagement.xml) do (    
    set str=%%G     
    set mydate=%%G    
    echo got-    
    echo %%G    
    echo %mydate%    
    PAUSE

    ECHO %mydate%|findstr /R /C:[0-9][0-9][0-9][0-9]\\[0-9][0-9]\\[0-9][0-9] > nul    
    IF ERRORLEVEL 0 goto valueok    
)

echo DONE    
PAUSE

goto end    

:valueok    
echo VALUEOK

:end    
PAUSE

不幸的是,这错误地将xml标头识别为有效日期;但我认为这与ErrorLevel被重置(?)有关。没有设置mydate,它将空变量mydate识别为匹配(!! ??)。输出是:

got-    
<?xml version="1.0" encoding="utf-8"?>    
ECHO is off.    
Press any key to continue . . .
VALUEOK    
Press any key to continue . . .

...

迫切需要一个解决方案。感谢...

2 个答案:

答案 0 :(得分:10)

错误级别未被重置。实际发生的事情是IF ERRORLEVEL 0的行为不符合您的预期。基本上,测试不是“错误级别是否等于0?”,它的“错误级别是否大于或等于零?”。鉴于此,应该清楚IF ERRORLEVEL 0将永远是真的(至少,如果你只是期望积极的错误......)

因此,您需要使用IF NOT ERRORLEVEL 1 goto valueok

答案 1 :(得分:0)

正如RB写的那样,IF ERRORLEVEL 0的行为并不像你期望的那样。

if errorlevel是一个特殊的IF案例 要使用普通的IF构造,您可以使用

setlocal EnableDelayedExpansion
...
FOR-LOOP .. DO (
    if !ERRORLEVEL! EQU 0 goto valueok