2012-11-02 14 views
5

Próbuję zreplikować wiersz polecenia za pomocą plików wsadowych. Mój obecny kod jest odtworzony poniżej.Replikowanie wiersza polecenia przy plikach wsadowych

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

Jednak mam jeden problem. Jeśli wywołuję program (taki jak gpedit.msc), plik wsadowy czeka, aż program wróci przed kontynuowaniem, gdy normalny wiersz polecenia powróci bez oczekiwania na powrót programu.

Jak sprawdzić, czy polecenie jest programem, więc mogę użyć polecenia start?

+1

Nie będzie to możliwe w przypadku samej CMD. To, czy CMD będzie czekać, czy nie, czekać na zakończenie programu, określa, czy program jest oparty na GUI, czy na tekście. np .: 'notepad.exe' kontra' chkdsk.exe'. A CMD nie dostarcza polecenia, aby to wykryć. – Jay

+0

@Jay To rozczarowujące. W każdym razie dzięki. – mc10

+0

Cóż, tam * jest * droga, twarda. Który ma przeanalizować nagłówek pliku EXE (nagłówek formatu pliku PE), aby sprawdzić, czy jest to GUI lub program tekstowy. Możesz to zrobić za pomocą skryptu VBScript jako pomocnika, który odczytuje plik binarny EXE (ręcznie, na poziomie bajtów) i raportuje wynik. Możesz także zrobić to za pomocą skryptu 'DEBUG.EXE', ale jest to bardziej kłopotliwe. – Jay

Odpowiedz

2

Możesz wyszukać plik wykonywalny dla 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

Zastanawiam się, czy to jest niezawodny czek ... W każdym razie pomysł jest bardzo interesujący! –

+0

To nie jest doskonałe. Na przykład, jeśli kod GUI jest ładowany za pomocą innego dll. Sprawdziłem Python.exe, który może utworzyć GUI za pomocą TK. Mój skrypt nie może znaleźć 'user32.dll'. Gdyby rekurencyjnie przeszukiwane biblioteki dll poprawiłyby się. Ale to przesada. 'python.exe -> tk85.dll -> user32.dll' –

+0

W normalnym pliku cmd.exe, czy sterowanie faktycznie powraca do cmd bezpośrednio po wywołaniu Pythona (bez' start')? –

Powiązane problemy