2013-10-03 10 views
7

Я довольно новичок в этом форуме, поэтому сначала хочу поблагодарить вас за предоставление мне решений даже до того, как я стал участником :).Не могу получить errorlevel от неудачной команды MOVE в пакетном скрипте

Так что у меня этот код:

for %%a in ("%PBpath%") do ( 
move "network location 1 files" "network location 2" >NUL 
if ERRORLEVEL 0 (echo Diagram %%~na.pdf was successfuly archived) else (echo   Diagram %%~na.pdf was not archived) 
ECHO.%errorlevel% 
     ) 

Проблема заключается в том, что я не могу получить ErrorLevel, отличный от 0. Даже если файлы, которые должны быть скопированы, отсутствуют места, я до сих пор получаю успешное архивированное сообщение эхом. Я искал форум для подобных вопросов, но я не мог заставить его работать по какой-то причине. Есть ли что-то другое между копией и командой ping (команда ping возвращает правильный код выхода в уровне ошибок), потому что я не могу получить его ни с копией, ни с перемещением ...

Спасибо! Эндрю

ответ

7

Странная вещь об утверждении IF ERRORLEVEL является то, что он не действует, как вы Expect- возвращает TRUE, если код ошибки равен ИЛИ ПРЕВЫШАЕТ указанный номер. Сбой в MOVE устанавливает уровень ошибок в 1 (я только что проверил), который больше 0. Следовательно, первое предложение в инструкции IF всегда будет использоваться. Самый простой способ исправить скрипт, чтобы полностью изменить условия в IF заявлении:

if ERRORLEVEL 1 (echo file was not archived) else (echo file was successfully archived) 
+0

Благодарим за ответы. Ответ Супербоба действительно решил мою проблему, большое спасибо. Это действительно противоречивое поведение. Однако команда ECHO.% Errorlevel% в моем примере все еще возвращает 0, поэтому в моем случае она не установлена ​​в 1. Что касается ответа Эндоро, можете быть более конкретным? Я попытался использовать% ERRORLEVEL% == 0, так как никакой другой вариант не работал бы с errorlevel в качестве переменной, но здесь и результата не было. – user2844129

+0

У вас есть какие-либо утверждения между IF ERRORLEVEL 1 и ECHO.% Errorlevel%? Если это так, они могут сбросить уровень ошибок. Я просто попробовал «если ERRORLEVEL 1 (echo ErrorLevel% ERRORLEVEL%, файл не архивирован) else (echo ErrorLevel% ERRORLEVEL%, файл успешно архивирован)' и получил ожидаемый результат 'ErrorLevel 1, файл не архивирован' – Superbob

+0

Нет, t есть что-то среднее между ними, но вы правы, это работает. Проблема заключалась в том, что я повторял «% ERRORLEVEL%» внутри цикла for, и я включил DelayedExpansion. Я должен был использовать! и это сработало. Спасибо за помощь! – user2844129

3

Просто используйте %ERRORLEVEL% переменную вместо ERRORLEVEL функции

0

Если кто-то хочет использовать функцию ERRORLEVEL, Superbob'sanswer адрес это (хотя я бы рекомендовал вместо этого форму if NOT ERRORLEVEL 1 (echo file was successfully archived) else (echo file was not archived)).

Но если вы хотите вместо этого использовать метод%% ERRORLEVEL%, необходимо включить Delayed Expansion. Код OP, приведенный выше, с рекомендуемыми изменениями, приведен ниже:

setlocal enabledelayedexpansion 

for %%a in ("%PBpath%") do (
    move "network location 1 files" "network location 2" >NUL 
    if !ERRORLEVEL! equ 0 (
    echo Diagram %%~na.pdf was successfully archived 
) else (
    echo Diagram %%~na.pdf was not archived) 
) 

 Смежные вопросы

  • Нет связанных вопросов^_^