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
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"% * –
Dzięki. Lubię to. Ustawiłem go w rejestrze zgodnie z sugestią. –