2012-11-02 15 views
5

バッチファイルを使用してコマンドプロンプトを複製しようとしています。私の現在のコードは以下の通りです。バッチファイルを使用してコマンドプロンプトを複製する

@echo off 
title Command Prompt 
:LOOP 
set /p COMMAND="%CD%>" 
title Command Prompt - %COMMAND% 
call %COMMAND% 
echo. 
title Command Prompt 
goto LOOP 

しかし、私には1つの問題があります。私がプログラムを呼び出す場合(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に戻りますか? –

関連する問題