c++ - Windows 批处理命令 - 高级错误抑制问题

标签 c++ windows batch-file implementation

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

问题是我无法抑制错误的文本。我可以“cls”,但这意味着几乎每个命令都会对提示进行 cls,我不想将其强加给用户。我还尝试在其后使用 >nul,并在命令前使用 2>nul。 2>nul CMDOW.EXE/RUN 的问题在于它不会将错误存储在 ERRORLEVEL 环境变量中......我也几乎每次在他们使用命令时都无法显示此错误信息提示。

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

我这样做是为了使输入不再是标准的dos输入,而是带有模仿通常界面的提示的set/p命令。我明白了,如果它在使用 CMDOW 的 PATH 中,则在键入程序名称时不会等待,如果它前面没有“开始”。

现在一切正常,除了我有一个小问题,这是一个很大的视觉干扰。我提示用户并将输入存储到环境变量,然后使用 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

最佳答案

试试这个...

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

在此之后您应该仍然可以访问 ERRORLEVEL

关于c++ - Windows 批处理命令 - 高级错误抑制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8191548/

相关文章:

batch-file - 批处理 - 在一条语句中为参数添加后缀

python - 使用批处理、Python 等自动编辑文本文件

c++ - 异常未在辅助线程中捕获,从而导致段错误

c++ - 当 ld 链接同一个库的不同版本时会发生什么

c++ - 如何创建 std::string 包装器,将 ptr 保留到 std::string 并将 ptr 保留到创建该包装器实例的类中的特殊类函数?

windows - 如何让我的程序在 Windows 7 启动时以不同的权限运行?

linux - 需要帮助将 .sh 文件转换为 .bat

batch-file - 在批处理文件中使用SetDelayedExpansion : handling dirs/filenames containing !

c++ - 我可以改进从文件中读取字符串吗?

c++ - C++ 中平滑的鼠标移动