Odpowiedzi:
Jeśli aplikacja Java nie zostanie zakończona (np. Używasz pliku wsadowego do uruchomienia aplikacji Java), użyj start
polecenia, 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.
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
start
Polecenie 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 start
polecenie, 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.
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ć.
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.
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.exe
okno 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 && exit
do 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.
próbować:
cmd /c "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
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.
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.
nohup
en.wikipedia.org/wiki/Nohup