Windows批处理命令 – 高级错误抑制问题

我正在编写一个非常大的目的驱动的Windows命令提示符批处理程序。

问题是我无法压制错误的文本。 我可以“封锁”,但这意味着几乎每个命令都会提示,我不想强​​迫用户。 我也尝试过使用> nul,而在命令前面使用2> nul。 2> nul CMDOW.EXE / RUN的问题是,那么它不会在ERRORLEVEL环境variables中存储错误….我也不能有这个错误信息显示几乎每次他们使用命令提示。

我的控制台做了很多事情,包括快速导航和网页/程序/文件夹访问。 最近我一直在试图围绕中央批处理程序实现一个基本的包装,这样如果你input一个无法识别的命令,它将首先检查你input的文本string是否是你当前目录下文件夹名称的开始。 如果是这样,它会自动移动到文件夹中。 否则,将显示通常的错误消息。

我这样做是为了使input不再是标准的dosinput,而是一个带有模仿通常界面的提示的set / p命令。 我知道了,所以如果在使用CMDOW的PATH中不input“start”,则不会等待input程序名称。

现在所有的function,除了我有一个小的问题,这是一个巨大的视觉滋扰。 我提示用户并将input存储到环境variables中,然后使用CMDOW.exe / RUN首先尝试执行input文本并查看它是否是可执行文件(这涵盖了path以及当前目录中的.exes) 。 然后我检查ERRORLEVEL,看看是否导致错误。 如果是这样,我继续下一个方法。

我也尝试写一个小的C ++程序来执行我,它很容易与winexec工作,但idk如何获得错误代码,以确认过程开始成功。 如果我能做到这一点,那么我可以把这个结果发送给一个环境variables。 CreateProcess()不工作,而不是绝对的位置。 我不能只是插入input文本,并使其工作,但它暂停,直到终止无论如何,我相信。 ShellExecute()可以工作,但看起来并不像从input中插入那样简单…虽然它似乎有一个获得输出的方法。 我可能会添加我在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 '[az]' '[AZ]'|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 

    尝试这个…

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

    在这之后你仍然应该可以访问ERRORLEVEL

    我没有看到任何理由,因为2>nul CMDOW.EXE /RUN不返回ErrorLevel值,而CMDOW.EXE /RUN返回它,除非CMDOW.EXE这样写; 这个声音对我来说很陌生。

    下面的批处理文件检查一个命令是否是一个可执行文件,并通过ErrorLevel返回这些值:如果找不到,则返回1;如果在当前目录中找到1,则返回2;如果在PATH变量的目录中找到2。 我希望你可以使用这个批处理文件的修改版本而不是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 

    请告诉我,如果这种方法工作,或者如果你有一个额外的问题,使用它。