2012-11-02 122 views
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.exe'和'chkdsk.exe'。 CMD不提供檢測這個的命令。 – Jay

+0

@Jay令人失望。不過謝謝。 – mc10

+0

那麼,有*是一種方式,一個很難。解析EXE文件的頭文件(PE文件格式的頭文件)來檢查它是GUI還是文本程序。您可以使用VBScript作爲幫助程序來讀取EXE二進制文件(手動,在字節級別)並報告結果。您也可以使用'DEBUG.EXE'腳本來完成,但這會更麻煩。 – Jay

回答

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% 
+0

我不知道這是否可靠的支票......無論如何,這個想法非常有趣! –

+0

這並不完美。例如,如果gui代碼通過另一個DLL加載。 我檢查了python.exe,它可以使用tk創建一個gui。我的腳本找不到'user32.dll'。如果它遞歸搜索dll,它會改善。但是這太過於誇張了。 'python.exe - > tk85.dll - > user32.dll' –

+0

在普通的cmd.exe中,控件是否在調用Python(不帶'start')後直接返回到cmd? –

相關問題