使用批处理文件复制命令提示符

5
我尝试使用批处理文件来复制命令提示符。 我目前的代码如下所示。
@echo off
title Command Prompt
:LOOP
set /p COMMAND="%CD%>"
title Command Prompt - %COMMAND%
call %COMMAND%
echo.
title Command Prompt
goto LOOP

然而,我有一个问题。如果我在调用一个程序(例如 gpedit.msc ),批处理文件会等待程序返回后才继续执行,而普通命令提示符则不需要等待程序返回即可返回。

如何测试命令是否是程序,以便可以使用 start 命令?


1
仅使用CMD是不可能实现的。无论CMD是否等待程序完成,取决于程序是基于GUI还是文本的。例如:notepad.exechkdsk.exe。而CMD并没有提供检测这一点的命令。 - Jay
@Jay 很失望。不过还是谢谢你。 - Kevin Ji
嗯,有一种方法,但是比较困难。就是解析EXE文件的头部(PE文件格式的头部),来检查它是GUI程序还是文本程序。你可以使用VBScript作为辅助工具,手动读取EXE二进制文件(以字节为单位),并报告结果。你也可以使用DEBUG.EXE脚本来实现,但这更麻烦。 - Jay
你可以搜索可执行文件中的 user32.dll - William Bettridge-Radford
1个回答

2
你可以搜索可执行文件中的 user32.dll
@echo off
title Command Prompt
:LOOP
    set /p COMMAND="%CD%>"
    title Command Prompt - %COMMAND%

    call :is_gui %COMMAND%
    if errorlevel 1 (
        call %COMMAND%
    ) else (
        start "" %COMMAND%
    )

    echo.
    title Command Prompt
    goto LOOP

:is_gui app_name
    set app_name=%~1
    set file_app=

    rem Get path of application
    if exist "%app_name%" (
        set file_app=%app_name%
    ) else (
        rem Lookup path of app
        for %%P in (%PATHEXT%) do (
          for %%I in (%1 %1%%P) do (
            if exist "%%~$PATH:I" (
              set file_app=%%~$PATH:I
              goto continue
            )
          )
        )
    )
    :continue
    if "%file_app%"=="" exit /b 1
    find /i "user32.dll" < "%file_app%" >nul 2>&1
    exit /b %errorlevel%

我想知道这是否是一个可靠的检查...无论如何,这个想法非常有趣! - Andriy M
这并不完美。例如,如果GUI代码是通过另一个DLL加载的。我检查了可以使用tk创建GUI的python.exe。我的脚本找不到user32.dll。如果它递归搜索dll,它会变得更好。但对于这个来说有点过度了。python.exe --> tk85.dll --> user32.dll - William Bettridge-Radford
在正常的cmd.exe中,如果没有使用start,Python被调用后,控制实际上会直接返回到cmd吗? - Andriy M
那么,由于python.exe中没有user32.dll,因此您的脚本将在没有start的情况下运行它,并且行为与真实的CMD相同,对吗?如果我正确理解了情况,这就没有问题。 - Andriy M
这不是可靠的检查。例如 - Far Manager。它的可执行文件链接到user32.dll,但它是控制台应用程序,而不是GUI。 - Maximus
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接