Пакетные команды Windows - проблема с расширенным подавлением ошибок - PullRequest
1 голос
/ 19 ноября 2011

Я программирую очень большую целевую пакетную программу командной строки Windows.

Проблема в том, что я не могу подавить текст ошибки.Я мог бы "cls", но это означает, что почти каждая команда будет cls подсказку, и я не хочу навязывать это пользователям.Я также попытался использовать> nul после него и 2> nul перед командой.Проблема с 2> nul CMDOW.EXE / RUN состоит в том, что тогда она не сохраняет ошибку в переменной среды ERRORLEVEL .... У меня также не может быть этой информации об ошибке, появляющейся почти каждый раз, когда они используют команду вprompt.

Моя консоль выполняет множество функций, включая быструю навигацию и доступ к веб-странице / программе / папке.Недавно я пытался внедрить базовую оболочку вокруг центральной пакетной программы, чтобы при вводе чего-то, что является нераспознанной командой, она сначала проверила, является ли введенная вами текстовая строка началом имени папки в вашем текущем каталоге.,Если это так, он автоматически переместит вас в папку.Если нет, то будет отображаться обычное сообщение об ошибке.

Я сделал так, чтобы ввод больше не был стандартным вводом dos, а командой set / p с приглашением, имитирующим обычный интерфейс.Я понял, что он не ждет при наборе имени программы, когда ему не предшествует «start», если оно находится в PATH с использованием CMDOW.

Теперь все работает, за исключением небольшой проблемы, которая вызывает большие визуальные неудобства.Я запрашиваю пользователя и сохраняю ввод в переменную окружения, затем использую CMDOW.exe / RUN, чтобы сначала попытаться выполнить вводимый текст и посмотреть, является ли это исполняемым файлом (это охватывает пути, а также .exes в текущем каталоге),Затем я проверяю ERRORLEVEL, чтобы убедиться, что это привело к ошибке.Если так, я перехожу к следующему методу.

Я также пытался написать небольшую программу на C ++, чтобы она выполнялась для меня, она легко работает с winexec, но я не знаю, как получить код ошибки, чтобы подтвердить успешное начало процесса.Если я могу это сделать, то я могу просто отправить этот результат в переменную окружения.CreateProcess () не работает без абсолютного определения местоположения.Я не могу просто вставить входной текст и заставить его работать, но в любом случае, я полагаю, что он останавливается до завершения.ShellExecute () работает, но не так просто, как подключить его к входным данным ... хотя, похоже, у него есть готовый метод получения выходных данных.Я могу добавить, что я не очень хорош в C ++, я изучаю, что мне нужно, чтобы обойтись

Я не уверен, как обойти эту проблему.Я также не уверен, существует ли какой-то особый метод, позволяющий обойти эту ошибку и при этом узнать, что она не выполняется должным образом.

Вот мой код:

@SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF

@for /L %%i in (0,0,0) do @(
    set zinput=
    set /p zinput=^%time%[%cd:~0,1%]^>
    call :EXECUTE
    set zinput=
)

:EXECUTE
IF ("%zinput%")==("") GOTO :EOF
cmdow /run "%zinput%"
set ERRCODE=%ERRORLEVEL%
IF ("%ERRCODE%")==("1") call :UNDEFINED
GOTO :EOF

:UNDEFINED
%zinput%
set ERRCODE=%ERRORLEVEL%
IF %ERRCODE%==9009 GOTO ZDIR
GOTO :EOF

:ZDIR
set zDIR=
DIR /B /AD-H|sed -n "/^%zinput%/"Ip>"%aicnspath%\etc\dump.txt"
set /p zDIR=<"%aicnspath%\etc\dump.txt"
IF NOT DEFINED zDIR GOTO UNDEFINED2
cd %zDIR%
call "%aicnspath%\etc\update.bat"
cls
echo AUTO-MOVED INTO: %CD%|tr '[a-z]' '[A-Z]'|sed "s/^/%_hc%%_bc2%/"|sed "s/$/%_bc%/"
echo -----------------------------------------
echo/
GOTO :EOF

:UNDEFINED2
cls
echo/
echo  The string %_hc%%_bc2%^'%zinput%^'%_bc% is not recognized by AICNS as any internal or external command, operable program or batch file.
echo/
GOTO :EOF

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Попробуйте это ...

CMDOW /run "%zinput%" >nul 2>&1

После этого у вас все еще должен быть доступ к ERRORLEVEL.

2 голосов
/ 19 ноября 2011

Я не вижу никакой причины, потому что 2>nul CMDOW.EXE /RUN не возвращает значение ErrorLevel, тогда как CMDOW.EXE /RUN возвращает его, если CMDOW.EXE не был написан таким образом;это звучит очень странно для меня.

Пакетный файл ниже проверяет, является ли команда исполняемым файлом, и возвращает эти значения через ErrorLevel: 0, если не найден, 1, если найден в текущем каталоге, и 2, если найден вкаталог переменной PATH.Я надеюсь, что вы можете использовать модифицированную версию этого пакетного файла вместо программы CMDOW.EXE для решения вашей проблемы.

PATHOF.BAT:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM CREATE A LIST OF FILE NAMES ADDING THE EXECUTABLE EXTENSIONS
SET NAMEEXT=!PATHEXT:.=%1.!
REM SEARCHES FILE NAMES IN CURRENT DIRECTORY, IF FOUND: ERRORLEVEL=1
FOR %%N IN (%NAMEEXT%) DO IF EXIST %%N ECHO %%N & EXIT /B 1
REM SEARCHES FILE NAMES IN DIRECTORIES OF PATH VARIABLE, IF FOUND: ERRORLEVEL=2
FOR %%N IN (%NAMEEXT%) DO IF NOT "%%~$PATH:N" == "" ECHO %%~$PATH:N & EXIT /B 2
REM IF FILE NOT FOUND, ERRORLEVEL=0
ECHO '%1' is not an external command or batch file located in PATH & EXIT /B 0

Пожалуйста, дайте мне знать, если этот методсработало или если у вас возникли дополнительные проблемы с его использованием.

...