Dlaczego polecenie cmd nie kończy działania po wykonaniu pliku wsadowego?


23

Dlaczego polecenie cmd nie kończy działania po wykonaniu pliku wsadowego?

Próbowałem:

"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

i

@echo off
"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
exit

Odpowiedzi:


30

Jeśli aplikacja Java nie zostanie zakończona (np. Używasz pliku wsadowego do uruchomienia aplikacji Java), użyj startpolecenia, aby ją uruchomić: -

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

Spowoduje to uruchomienie aplikacji Java i wykonywanie pliku wsadowego bez oczekiwania na zakończenie aplikacji Java.


20

Wyjaśnienie:

Oto jak to działa; plik wsadowy jest przetwarzany jeden wiersz na raz. Każde polecenie jest wykonywane kolejno, a procesor wsadowy czeka na zakończenie jednego polecenia przed rozpoczęciem następnego. Występuje problem, ponieważ uruchamiana aplikacja Java (Jilko.jar) to program okienkowy, który działa nawet po linii, która go uruchamia. Gdyby było to narzędzie, które wykonuje jakąś akcję, a następnie kończy działanie, plik wsadowy przejdzie do następnego polecenia (lub zakończy działanie, jeśli nie będzie już więcej). Ponieważ program nadal działa, procesor wsadowy czeka, aż okno zostanie zamknięte przed przejściem dalej. Możesz to zobaczyć w działaniu, zamykając program Java: okno konsoli z plikiem wsadowym następnie zamyka się.


Rozwiązanie:

Aby to naprawić, należy poinstruować procesor wsadowy, aby uruchomił program i kontynuował bez czekania jako taki:

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

Jak wspomniano Terrance , ""to tytuł, którego należy użyć w oknie konsoli. Jest to jednak opcjonalne tylko wtedy, gdy polecenia nie ma w cudzysłowach; w przeciwnym razie jest wymagane . Możesz włożyć coś tam, jeśli chcesz lub zostawić puste, ale jeśli polecenie jest w cudzysłowie, musi być obecne, w przeciwnym razie interpreter poleceń potraktuje cytowane polecenie jako tytuł i otworzy konsolę, która po prostu tam siedzi i czeka na coś do zrobienia.

Zamiast tego możesz użyć czegoś z następującego polecenia, ale cudzysłowy są po prostu łatwiejsze i bezpieczniejsze, ponieważ skrócone nazwy nie są takie same w każdym systemie.

start C:\Progra~2\Java\jre6\bin\javaw.exe -Xmx1024M -Xms1024M -jar Jilko.jar

startPolecenie jest wbudowane polecenie, które spawns procesu (w zasadzie jak działa program z menu Start). W tym kontekście dzieje się tak, że procesor wsadowy uruchamia startpolecenie, które z kolei uruchamia określony program i kończy działanie (sam, a nie program odrodzony). W związku z tym proces wsadowy działa zgodnie z oczekiwaniami. Ma także kilka przydatnych opcji, takich jak uruchomienie programu zminimalizowanego ( /min) lub zmaksymalizowanego ( /max), uruchomienie go z niskim priorytetem ( /low) i tak dalej. Zobacz start /?szczegóły.


Czy możemy zacząć jak nohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy

Nie. (Chyba że chcesz porównać z nohup i &).
Hennes

6

Przekonałem się, że niektóre programy, które uruchamiam, pozostawiają uruchomione procesy, a okno konsoli nie zamknie się, dopóki się nie zakończą, jeśli uruchomię je przez uruchomienie pliku wykonywalnego.

Program START to rozwiązuje, ale stary problem z START nadal istnieje. Nie możesz po prostu użyć:

START "c:\my dir\myfile.exe"

Pierwszym parametrem START jest wciąż nazwa okna. Jeśli go pominiesz, po prostu otworzysz konsolę CMD z oknem o nazwie, którą próbujesz uruchomić. W powyższym przypadku miałbym teraz okno konsoli o tytule okna „ c: \ my dir \ myfile.exe ”. Nie to, co chciałem!

Aby pominąć nazwę okna, użyj pary podwójnych cudzysłowów, aby zdefiniować pusty ciąg, na przykład:

START "" "c:\my dir\myfile.exe"

Na koniec zakończ plik wsadowy poleceniem EXIT, aby upewnić się, że zostanie zamknięty.

Ta metoda wydaje się działać konsekwentnie w systemach Windows 7 i 8.

Przy rozwiązywaniu problemów stwierdzam, że dodanie ECHO tego, co zamierzam zrobić, a następnie TIMEOUT tego, co właśnie zrobiłem, bardzo pomaga. Na przykład:

ECHO I'm about to launch the program...
START "" "c:\my dir\myfile.exe"
TIMEOUT 5

Ponieważ Limit czasu daje ci odliczanie, nie musisz ECHO, że masz zamiar opóźnić.


5

Ponadto - używaj EXIT przez cały czas, pod Windows 7, ponieważ samo dotarcie do końca pliku wsadowego niekoniecznie go kończy - tak jak we wcześniejszych wersjach systemu Windows. Windows 7 może być bardziej wrażliwy na to niż wcześniejsze wersje NT (np. Windows 2000 Professional). Zostało to wspomniane w niektórych, ale nie we wszystkich poprzednich odpowiedziach.

Szczegóły osobistego doświadczenia wspierającego odpowiedź:

Po przeniesieniu instalacji StarOffice5.2 z systemu Windows 2000 do systemu Windows 7 pojawiały się błędy przestrzeni pamięci po zakończeniu działania pakietu. Nie było to widoczne w systemie Windows 2000.

Wiele lat temu napisałem pliki wsadowe, aby automatycznie wykonać kopię zapasową i przywrócić plik soffice.ini, aby umożliwić naprawę, gdy zostanie ona uszkodzona (często jest to problem - pakiet nie ładuje się). Automatyczna kopia zapasowa (uruchamiana przez łącze do pliku wsadowego umieszczonego w Office52 \ user \ config \ startup) następuje jednak dopiero po 5 sekundach. Za każdym razem, gdy wychodziłem z pakietu tuż przed uruchomieniem pliku wsadowego, zauważyłem, że zakończenie pakietu przebiegło bezbłędnie. To wskazało mi na problem z plikami wsadowymi.

Po umieszczeniu polecenia „EXIT” jako ostatniego wiersza w plikach wsadowych pakiet biurowy zaczął się kończyć bez komunikatów o błędach dotyczących miejsca w pamięci przez cały czas, niezależnie od tego, czy pliki wsadowe zostały uruchomione.


2

Po zakończeniu aplikacji aplikacja powinna wyjść. Czy na pewno aplikacja Java jest poprawnie zamykana?


2

Właśnie miałem do czynienia z tym samym problemem, który ostatecznie rozwiązał się po wprowadzeniu, jak się wydawało, przypadkowych zmian w pliku wsadowym - nie rozumiem dlaczego, ale opublikuję go tutaj, aby pomóc komuś innemu później.

Korzystam z narzędzia SysInternals Pskill i narzędzia uśpienia , ponieważ XP Home nie zawiera wielu funkcji wiersza poleceń.


To jest plik wsadowy, który faktycznie zamyka się po zakończeniu:

@echo off
start /min C:\Progra~1\PsTools\pskill.exe explorer.exe
start /min C:\Progra~1\PsTools\pskill.exe Powermenu.exe
start /min C:\Progra~1\PsTools\pskill.exe PWGen.exe
start /min C:\Progra~1\PsTools\pskill.exe redshiftgui.exe
start /min C:\Progra~1\PsTools\pskill.exe clipx.exe
sleep 2
start explorer.exe
sleep 3
start C:\Progra~1\ClipX\clipx.exe
sleep 1
start C:\Progra~1\Powermenu\PowerMenu.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
start C:\Progra~1\RedshiftGUI\redshiftgui.exe && exit

Gdybym tak zmienił kilka ostatnich linii, okno cmd pozostanie otwarte, dopóki nie kliknę „X” w rogu:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe && exit

Nawet gdy próbowałem wywołać pskill, aby się zabić, proces cmd.exe zniknąłby z Menedżera zadań, a pskill zgłosiłby z wnętrza swojego cmd.exe, że proces cmd.exe został zabity, ale cmd.exeokno nadal pozostanie otwarte, dopóki Kliknąłem „X” w rogu:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
C:\Progra~1\PsTools\pskill.exe cmd.exe

Po dodaniu && exitdo każdej linii zauważyłem, że niektóre z nich zareagowały i przerwały przetwarzanie wsadowe, podczas gdy inne nie.

Dlatego umieściłem jeden z reagujących na końcu zamiast tego, jak go pierwotnie miałem.

Jak powiedziałem, nie wiem dlaczego, ale cieszę się, że to już koniec.


1
To jest tak niepotrzebne .
surfasb

&& exit działa dla mnie
jekcom


0

Oto jak to zrobiłem:

  1. Utwórz plik wsadowy o następującej treści:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. W strumieniu wejściowym wyjścia dodaj:

    System.exit(1);
    

0

System Windows 2003 domyślnie nie ma „Kont użytkowników” w Panelu sterowania. Napisałem krótką partię, aby otworzyć konta użytkowników:

@echo off  
rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll  
exit

Działało OK, Konta użytkowników otworzyły się, ale okno CMD również pozostało otwarte. Po kilku badaniach tutaj dodałem: START „” na początku wiersza 2 w następujący sposób:

@echo off  
Start "" rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll o
exit

Teraz otwiera się okno Konta użytkowników, pozostaje otwarte, a okno CMD zamyka się. Bułka z masłem.


0

Szukałem rozwiązania zamykającego okno pliku wsadowego, gdy polecenie EXIT pozostawia okno otwarte z nieznanego powodu. W końcu natknąłem się na rozwiązanie.

Usuń EXIT z końca pliku wsadowego i użyj:

Taskkill /IM conhost.exe /F

0

Utworzyłem plik wsadowy do użytku sieciowego na 32-bitowym komputerze z systemem Windows 7, a cmd pliku wsadowego nie zostanie zamknięty po wykonaniu. Uruchamiam ten sam plik wsadowy na innym 64-bitowym komputerze z systemem Windows 7, a cmd pliku wsadowego kończy się normalnie.

Wypróbowałem sugestię Bryana i nie działa ona na tym 32-bitowym komputerze z systemem Windows 7, ponieważ nie istniał proces conhost.exe, więc zmodyfikowałem go w następujący sposób:

Taskkill /IM cmd.exe /F

Plik wsadowy wykorzystania netto nie zawsze kończy się normalnie i pokazuje losowo potwierdzenie „Zakończ zadanie wsadowe (T / N)” .

Zgodnie z tym wątkiem zmodyfikowałem plik wsadowy w następujący sposób:

@echo off

if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)

net use \\Server\folder

Taskkill /IM cmd.exe /F

Plik wsadowy do wykorzystania w sieci ostatecznie kończy się normalnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.