Пакетный файл ErrorLevel горе - PullRequest
3 голосов
/ 18 апреля 2011

Я пишу командный файл для обновления некоторых систем.Мне нужно проанализировать дату из XML-файла и сохранить его для последующего использования в этом файле.Формат даты: гггг \ мм \ дд.

На данный момент у меня есть следующее:

@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 голосов
/ 18 апреля 2011

ErrorLevel не сбрасывается. На самом деле IF ERRORLEVEL 0 ведет себя не так, как вы ожидаете. По сути, тест не «Уровень ошибки равен 0?», А «Уровень ошибки больше или равен нулю?». Учитывая это, должно быть ясно, что IF ERRORLEVEL 0 всегда будет истинным (по крайней мере, если вы ожидаете только положительные ошибки ...)

Поэтому вам нужно использовать IF NOT ERRORLEVEL 1 goto valueok вместо этого.

0 голосов
/ 18 апреля 2011

Как писал РБ, IF ERRORLEVEL 0 ведет себя не так, как вы ожидаете.

if errorlevel - это особый случай IF.
Для использования нормальной IF-конструкции вы можете использовать

setlocal EnableDelayedExpansion
...
FOR-LOOP .. DO (
    if !ERRORLEVEL! EQU 0 goto valueok
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...