Пакетный скрипт не вызывает ERRORLEVEL при сбое

Я изучаю пакетные сценарии Windows. Мне нужно вызывать ошибки при сбое операций копирования, перемещения или удаления. Я сделал пример сценария, и по какой-то причине, когда операция завершается неудачей, я не могу поднять уровень ERRORLEVEL. Запускаю скрипт а файлы либо не существуют либо открываются в другой программе и в консоль выводятся stderr сообщения, но ERRORLEVEL никогда не поднимается, почему так? Кроме того, есть ли способ передать stderr в переменную, которую я мог бы проверить, если я не могу поднять ERRORLEVEL?

Мой код выглядит следующим образом:

`@Echo Off
ECHO.
Set /P myVar=Please enter a value:
Echo var = %myVar%
ECHO Trying to delete the file dummy.csv >> log.txt
Set myVar2 = nothing
DEL C:\dummy420.csv  
IF NOT ERRORLEVEL 0 ECHO There was an error
ECHO %ERRORLEVEL%
REM 2>myVar2
REM Echo 2>
REM Echo %myVar2%
Echo 2>&1
REM && (echo yourCommand was successful) || (echo yourCommand failed)
IF NOT ERRORLEVEL 0 ECHO There was an error
ECHO %ERRORLEVEL%
Move ""C:\dummy420.csv" D:\"
IF NOT ERRORLEVEL 0 ECHO There was an error
Set /P dummy=Press Enter to End`

Это мой вывод:

Please enter a value:hello
var = hello
C:\dummy420.csv
The process cannot access the file because it is being used by another process.
0
ECHO is off.
0
The filename, directory name, or volume label syntax is incorrect.
Press Enter to End

person Ibad Rahman    schedule 26.06.2015    source источник
comment
Просто чтобы добавить кое-что, попытки повторить ERRORLEVEL всегда возвращают «0», а операторы IF никогда не срабатывают.   -  person Ibad Rahman    schedule 26.06.2015


Ответы (1)


Команда DEL не меняет уровень ошибки - дополнительная информация Проверьте debenham предложение для обнаружения неудачного удаления:

3>&2 2>&1 1>&3 del C:\dummy420.csv|findstr . && echo DEL failed || echo DEL succeeded

изменить уровень ошибки:

3>&2 2>&1 1>&3 del C:\dummy420.csv|findstr .&& cmd /c exit /b 1
person npocmaka    schedule 26.06.2015
comment
Какие команды создают уровни ошибок для каких условий? Есть ли способ легко записать stderr в переменную? Я предполагаю, что перемещение и копирование также не повышают уровень ошибок? РЕДАКТИРОВАТЬ: О, я вижу, вы захватываете и изучаете stderr..... - person Ibad Rahman; 26.06.2015
comment
@IbadRahman - копирование и перемещение правильно установят уровень ошибок. Проблема только с RD, DEL и перенаправлением. Опубликованная строка повысит уровень ошибок с помощью команды FINDSTR. - person npocmaka; 26.06.2015
comment
Что ты здесь делаешь? пока stderr вообще что-нибудь (не пустой или нулевой), вы обнаружите ошибку? Что делает труба перед findstr? Во всяком случае... Я прочитаю вашу ссылку... TY! - person Ibad Rahman; 26.06.2015