批处理文件ErrorLevel困扰

kre*_*eid 3 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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这错误地将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 . . .
Run Code Online (Sandbox Code Playgroud)

...

变得非常渴望一个解决方案.谢谢...

RB.*_*RB. 10

ErrorLevel未被重置.实际发生的事情是IF ERRORLEVEL 0不按照您的预期行事.基本上,测试不是"错误级别是否等于0?",它的"错误级别是否大于或等于零?".鉴于此,应该很清楚,IF ERRORLEVEL 0总是如此(至少,如果你只是期望积极的错误......)

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

  • @kreid:您设置变量并在同一个块中使用其值.这种块中的变量在读取时会扩展(并由它们的值替换),而不是在运行时.因此`%mydate%`将被变量在循环之前的值替换.使用延迟扩展和`!mydate!`(参见`help set`). (3认同)