2009-05-20 19 views
6

Napisałem plik wsadowy do automatyzacji niektórych zadań. Mogę uruchomić go z poziomu okna poleceń, uruchomi się i wyświetli wyniki. Jeśli jednak dwukrotnie kliknę to na eksploratorze, uruchamia się i kończy natychmiast, więc nie widzę wyników.Sposób wstrzymania pliku wsadowego Windows po dwukrotnym kliknięciu?

Czy jest jakiś sposób, aby okno pliku wsadowego pozostało otwarte do czasu, aż je odrzucę, gdy uruchomię je, klikając dwukrotnie ikonę?

Nie chcę, aby parametr// nopause był przekazywany podczas wywoływania pliku wsadowego z wiersza poleceń. Chciałbym rozwiązanie, w którym mogę użyć pliku wsadowego bez konieczności zrobienia czegoś zbyt specjalnego?

Dzięki.

UWAGA Nie chcę, aby pauza podczas uruchamiania z wiersza poleceń !! Mogę nazwać ten plik wsadowy z innego pliku wsadowego, aby przeprowadzić ładunek operacji. W takim przypadku nie mogę siedzieć tam, aby nadal uderzać.

Najlepiej byłoby, gdybym mógł umieścić kod w pliku wsadowym, aby mógł sprawdzić, od czego został uruchomiony, a następnie wstrzymać lub nie.

Odpowiedz

13

Zastosowanie:

cmd /K myBatch.bat 

jako skrót.

+9

Można to osiągnąć dla * wszystkich * plików wsadowych, modyfikując następujący klucz rejestru: HKEY_CLASSES_ROOT \ batfile \ shell \ open \ command. Ustaw wartość z "% 1"% * na cmd/k "% 1"% * –

+0

Dzięki. Lubię to. Ustawiłem go w rejestrze zgodnie z sugestią. –

-1

stosowanie „pause” w pliku wsadowym w końcu, i będzie czekać na wejście użytkownika

HTH

+3

To * zawsze * wstrzyma, nie tylko po dwukrotnym kliknięciu pliku wsadowego. –

2

na końcu wydruku pliku

pause 

będzie czekać na AnyKey wejścia

+4

nie działa. Po prostu uruchamia plik, a następnie automatycznie zamyka okno. –

0

można po prostu dodać params na wezwanie partii i obsługiwać warunkowo wstrzymać oświadczenie w swojej partii. Tak więc po uruchomieniu z linii poleceń lub dblclick partia może przerwać, gdy wywołana z innych partii z parametrem/nopause nie zatrzymuj się.

+1

"Nie chcę, aby parametr// nopause był przekazywany podczas wywoływania pliku wsadowego z wiersza poleceń." zostało zadeklarowane w pytaniu. –

+0

Czy znasz moją odpowiedź? Parametr "jest wywoływany z innych partii", gdy nie jest wywoływany z wiersza cmd! –

+0

Parametry wsadowe są metodą domyślną, ponieważ msdos. Co się stanie, jeśli udostępnisz swój skrypt programistom nie mającym uprawnień administratora do modyfikowania rejestru? Czy to podejście nieszablonowe? –

4

Oto rozwiązanie, które powinno działać dobrze i wziąć pod uwagę możliwość, że plik wsadowy może wywoływać inny plik wsadowy ("zagnieżdżony").

Można użyć Znajdź, aby szukać „/ C”, które nie powinny być obecne, jeśli partia plik jest uruchamiany z „Wiersz polecenia”:

echo %cmdcmdline% | find /i "/c" 

Ale można zrobić więcej " solidny "test za pomocą Znajdź Znajdź, aby wyszukać dłuższy ciąg lub nazwę pliku wsadowego.

Polecenie "Znajdź" nie będzie działało poprawnie, jeśli ciąg wyszukiwania zawiera (") podwójne cudzysłowy w nim.Aby obejść ten problem, można użyć zmiennej środowiskowej podstawienie do „dostosowania” ciąg dlatego odgrywa ładne z obejrzeć:

set newcmdcmdline=%cmdcmdline:"=-% 

to zazwyczaj powrót:

if the batch-file is run from a "Command Prompt" 
    newcmdcmdline=-C:\Windows\system32\cmd.exe- 

if the batch-file is run by clicking on the the batch-file 
(or the batch-file shortcut) from "Windows Explorer" 
    newcmdcmdline=cmd /c --D:\Path\test.cmd- - 

Następnie można użyć „Znajdź” przetestować jak:

echo %newcmdcmdline% | find /i "cmd /c --" 
or 
    echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" 

Następnie musisz zdecydować, czy chcesz „zagnieżdżone” batch-file zachowywać się tak, jeśli wykonywane w ten sam sposób jak wywołującego wsadowego pliku, lub jeśli chcesz zagnieżdżone batch-fi les, aby zawsze zachowywali się tak, jakby zostały wykonane z "Command Prompt".

Uważają, że jeśli używasz w zagnieżdżonych wsadowego pliku, a następnie testowanie tego:

echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" 

zawsze zawiedzie (nie pasuje), ponieważ% newcmdcmdline% zawiera nazwę zewnętrznej partii akt, nie zagnieżdżony plik wsadowy.

Pierwsze rozwiązanie zachowuje się tak samo dla wywołującego pliku wsadowego i wszystkich zagnieżdżonych plików wsadowych. Również doskonały, jeśli nie wywołasz żadnych plików wsadowych:

We wszystkich plikach wsadowych (wywołujących i zagnieżdżonych), które chcesz wykonać ten test, dodaj te linie, zazwyczaj w górnej części plików wsadowych (ty mogą wyłączyć echo wypowiedzi, jeśli chcesz):

if not defined withincmd call :testshell 
if %withincmd% EQU 0 echo This batch-file: %~dpf0 was executed directly (from Windows Explorer, ...). 
if %withincmd% EQU 1 echo This batch-file: %~dpf0 was executed from within a Command Prompt 
rem if %withincmd% EQU 0 pause 

Następnie gdzieś w każdej partii akt, dodaj testshell podrzędną funkcję:

goto :EOF 
:testshell 
rem "Nested" batch-files won't see this because withincmd is already defined 
if not defined newcmdcmdline set newcmdcmdline=%cmdcmdline:"=-% 
set withincmd=1 
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" 
if %errorlevel% EQU 0 set withincmd=0 
goto :EOF 

nawiązywać tylko warunkowe wezwanie do „testshell "raz, na szczycie najbardziej zewnętrznego pliku wsadowego.

W niektórych sytuacjach możesz chcieć, aby tylko "zewnętrzny" plik wsadowy zachowywał się inaczej, jeśli jest wykonywany z "Wiersza polecenia", a jeśli jest uruchamiany przez kliknięcie pliku wsadowego (lub partii) -file skrót) z "Eksploratora Windows". Tak więc pliki wsadowe wywoływane z "zewnętrznego pliku wsadowego" zawsze zachowują się tak samo niezależnie od sposobu ich uruchomienia.

Aby to działało, masz kilka możliwości.

1) Zapisz wartość "withincmd" przed wywołaniem innego pliku wsadowego i przywróć poprzednią wartość "withincmd" po zwróceniu zwanego pliku wsadowego. W większości przypadków jest to mało istotne.

2) W każdym pliku wsadowym należy używać nazwy zmiennej "global unique" dla "withincmd".

3) Wykonaj polecenie "Znajdź" za każdym razem, gdy musisz wiedzieć, w jaki sposób został uruchomiony bieżący plik wsadowy.

4) przyrost wartości zmiennej na wejściu do partii pliku i zmniejszyć to na zjeździe partii pliku, potem tylko sprawdzić, jak partia plik został uruchomiony, jeśli liczyć zmiennej = 1

Metoda 3 jest najprostszym, ale ma tę wadę, że jeśli zewnętrzny plik wsadowy jest wywołany od samego siebie (jak w rekursji) lub inny plik wsadowy, zmienna testowa (intracmd) nie zostanie poprawnie ustawiona.

Oto jak to zrobić za pomocą Metoda 3:

We wszystkich wsadowego plików (wywołanie i zagnieżdżone), że zależy Ci, aby ten test, dodaj te linie, zwykle w górnej partii-files (ci mogą wyłączyć echo wypowiedzi, jeśli chcesz):

call :testshell 
if %withincmd% EQU 0 echo This batch-file: %~dpf0 was executed directly (from Windows Explorer, ...). 
if %withincmd% EQU 1 echo This batch-file: %~dpf0 was executed from (or Nested) within a Command Prompt 
rem if %withincmd% EQU 0 pause 

Następnie gdzieś w każdej partii akt, dodaj testshell podrzędną funkcję:

goto :EOF 
:testshell 
if not defined newcmdcmdline set newcmdcmdline=%cmdcmdline:"=-% 
set withincmd=1 
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" 
if %errorlevel% EQU 0 set withincmd=0 
goto :EOF 

W tym przypadku, trzeba zadzwonić " zestaw testów " raz, na górze KAŻDEGO pliku wsadowego, a następnie ponownie po powrocie z wywoływania innego pliku wsadowego (lub wywołaj "testhell" za każdym razem, gdy musisz wiedzieć, w jaki sposób został uruchomiony bieżący plik wsadowy).

Oto jak to zrobić za pomocą Metoda 4:

We wszystkich wsadowego plików (wywołanie i zagnieżdżone), że zależy Ci, aby ten test, dodaj te linie, zwykle w górnej partii-files (ci mogą wyłączyć echo wypowiedzi, jeśli chcesz):

if not defined nestinglevel set nestinglevel=0 
set /A nestinglevel=nestinglevel+1 
call :testshell 
if %withincmd% EQU 0 echo This batch-file: %~dpf0 was executed directly (from Windows Explorer, ...). 
if %withincmd% EQU 1 echo This batch-file: %~dpf0 was executed from (or Nested) within a Command Prompt 
rem if %withincmd% EQU 0 pause 

Potem, gdzieś w obrębie każdego pliku wsadowego, dodaj testshell podrzędną funkcję:

goto :EOF 
:testshell 
if not defined newcmdcmdline set newcmdcmdline=%cmdcmdline:"=-% 
set withincmd=1 
if %nestinglevel% GEQ 2 goto :EOF 
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" 
if %errorlevel% EQU 0 set withincmd=0 
goto :EOF 

Należy również pamiętać, aby zmniejszyć zmiennej przy wyjściu z jednej partii plik, aby powrócić do wywołującego wsadowego pliku:

set /A nestinglevel=nestinglevel-1 

W tym przypadku, trzeba zadzwonić „testshell” raz, na górze każdej partii akt, a następnie ponownie po wróciłem z wywoływania innego pliku wsadowego (lub wywołuję "testhell" za każdym razem, gdy trzeba wiedzieć, w jaki sposób został uruchomiony bieżący plik wsadowy).

We wszystkich przypadkach, test% withincmd% do określenia, w jaki sposób obecna partia plik został uruchomiony, tak:

if %withincmd% EQU 0 pause 
if %withincmd% EQU 1 goto :EOF 
1

Mój problem był podobny - Chciałem pauzę na samym końcu, jeśli wywołana z Windows Explorer, ale bez pauzy, jeśli jesteś w oknie poleceń. Wpadłem na to. Na górze każdego pliku wsadowym, umieścić to:

if "%parent%"=="" set parent=%~0 
if "%console_mode%"=="" (set console_mode=1& for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set console_mode=0) 

a następnie na koniec

if "%parent%"=="%~0" (if "%console_mode%"=="0" pause) 

Obsługuje zagnieżdżonych wywołań wsadowych, gdzie tylko chcesz wstrzymać na końcu oryginalnego pliku wsadowego , nie w zagnieżdżonych plikach wsadowych. W zagnieżdżonym pliku wsadowym %parent% jest już ustawiony jako oryginalny wywołujący, więc nie będzie równy zagnieżdżonemu %~0. Jeśli masz bat1 który wywołuje bat2, to pozostawia otwartą możliwość podwójne kliknięcie BAT2 w Eksploratorze - w tym kontekście bat2 zostanie wstrzymane na końcu, natomiast jeśli bat1 rozmowy bat2, następnie bat2 nie będzie wstrzymać na końcu (tylko bat1 zostanie wstrzymane) .

Separator instrukcji & pomaga uniknąć bałaganu w przypadku czegoś, co jest wtórne w stosunku do głównej funkcji. Jeśli nie podoba ci się jej wygląd, po prostu umieść każdą instrukcję w nowej linii.

To podejście wygląda na /C jako jeden z parametrów polecenia uruchamiania (%cmdcmdline%). Zakłada, że ​​twoje pliki wsadowe nie używają opcji /C. Jeśli używasz /C sam, musisz zamiast tego sprawdzić, czy %COMSPEC% pojawia się w ciągu %cmdcmdline% (użyj FINDSTR). Gdy Explorer uruchamia plik bat, jego numer %cmdcmdline% obejmuje %COMSPEC% np. C:\Windows\System32\cmd.exe /C double_clicked_batch_file_name. W oknie poleceń, %cmdcmdline% ma po prostu cmd.exe (bez ścieżki). Używam CALL mybat zamiast cmd.exe /C mybat, ale być może będziesz musiał pracować z istniejącymi plikami wsadowymi.

Powiązane problemy