批处理文件中的ErrorLevel问题

3

我正在编写一个批处理文件来升级一些系统。我需要从一个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个回答

10

ErrorLevel未被重置。实际发生的情况是,IF ERRORLEVEL 0的行为方式与您期望的不同。基本上,测试并非“errorlevel是否等于0?”而是“errorlevel是否大于或等于零?”。由此可见,IF ERRORLEVEL 0将始终为true(至少,如果您只期望正错误...)

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


好的,那个有效。谢谢。现在关于我的日期没有正确设置怎么办?我在这里做错了什么吗? - kreid
@Joey 因此我的评论是“至少,如果你只期望正面的错误”;-) - RB.
啊,抱歉;我忽略了那个 :) - Joey
3
在同一个区块中设置变量并使用其值。在这样的区块中,变量的扩展(即用其值替换)是在读取时而不是运行时发生的。因此,%mydate% 将仅被替换为循环之前变量所具有的值。请改用延迟扩展和 !mydate!(参见 help set)。 - Joey

0
如RB所述,IF ERRORLEVEL 0的行为不符合您的预期。 if errorlevel是一个特殊的IF语句。 如果要使用普通的IF语句,可以使用以下命令:
setlocal EnableDelayedExpansion
...
FOR-LOOP .. DO (
    if !ERRORLEVEL! EQU 0 goto valueok

谢谢,我不知道那个。 你知道当我执行以下命令时,“mydate”没有被设置吗? set mydate=%%G - kreid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接