Я программирую очень большую целевую пакетную программу командной строки 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