2011-04-18 47 views
3

我在写一个批处理文件来升级某些系统。我需要从一个xml文件中解析一个日期并保存起来,以便稍后在文件中使用。日期的格式是yyyy \ MM \ dd。批处理文件ErrorLevel woes

我至今是:

@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 . . . 

...

获得相当迫切需要一个解决方案。谢谢...

回答

10

ErrorLevel没有被重置。实际发生的是IF ERRORLEVEL 0不符合您的预期。基本上,测试不是“Errorlevel equal 0?”,它的“错误级别大于或等于零?”。鉴于此,应该清楚IF ERRORLEVEL 0将始终为真(至少,如果您只希望正面错误...)

因此,您需要使用IF NOT ERRORLEVEL 1 goto valueok来代替。

+0

好吧,这工作。谢谢。现在怎么样mydate没有被正确设置。我在这里做错了什么? – kreid 2011-04-18 12:55:53

+0

@Joey因此,我的评论“至少,如果你只希望积极的错误”;-) – 2011-04-18 14:10:13

+0

啊,对不起;忽略那一个:) – Joey 2011-04-18 17:21:04

0

由于RB写道,IF ERRORLEVEL 0不符合您的期望。

if errorlevel是一个特殊的IF情况。
使用正常IF-构建你可以使用

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

谢谢,不知道。 您是否知道我的“mydate”没有被设置,当我这样做时: set mydate = %% G ?? – kreid 2011-04-18 14:02:58