Почему cmd не завершается после выполнения командного файла?


25

Почему cmd не завершается после выполнения командного файла?

Я пытался:

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

а также

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

Ответы:


31

Если приложение Java не завершает работу (например, вы используете командный файл для запуска приложения Java), используйте startкоманду для его запуска: -

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

Это запустит приложение Java и продолжит выполнение командного файла, не дожидаясь завершения приложения Java.


20

Объяснение:

Вот как это работает; пакетный файл обрабатывается по одной строке за раз. Каждая команда выполняется по очереди, и пакетный процессор ожидает завершения одной команды, а затем запускает следующую. Проблема, с которой вы столкнулись, заключается в том, что запускаемое вами Java-приложение (Jilko.jar) является оконной программой, которая продолжает работать даже после запуска строки. Если бы это был инструмент, который выполняет какое-то действие, а затем завершает работу, пакетный файл продолжит выполнение следующей команды (или завершит работу, если их больше нет). Поскольку программа все еще работает, пакетный процессор ждет, пока окно не закроется, прежде чем двигаться дальше. Вы можете увидеть это в действии, выйдя из Java-программы: окно консоли с командным файлом затем закроется.


Решение:

Что вам нужно сделать, чтобы это исправить, это дать команду пакетному процессору запустить программу и продолжить работу без ожидания, как таковой:

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

Как упомянул Terrance , ""заголовок для окна консоли. Однако это только необязательно, если команда не в кавычках; в противном случае требуется . Вы можете поместить что-то туда, если хотите, или оставить это пустым, но если команда в кавычках, она должна присутствовать, в противном случае интерпретатор команды будет рассматривать команду в кавычках как заголовок и откроет консоль, которая просто сидит в ожидании что-нибудь сделать.

Вместо этого вы можете использовать что-то в следующей команде, но кавычки проще и безопаснее, поскольку не гарантируется, что короткие имена будут одинаковыми в каждой системе.

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

Эта startкоманда является встроенной командой, которая порождает процесс (в основном, как запуск программы из меню «Пуск»). Так что в этом контексте происходит то, что пакетный процессор запускает startкоманду, которая, в свою очередь, запускает указанную программу и завершает работу (сама по себе, а не порожденная программа). Таким образом, пакетный процессор продолжает работу, как и ожидалось. Он также имеет некоторые опции, которые могут быть полезны, такие как запуск программы minimized ( /min) или maximized ( /max), запуск с низким приоритетом ( /low) и так далее. Смотрите start /?подробности.


Можем ли мы рассмотреть начало как nohup en.wikipedia.org/wiki/Nohup
Мухаммед Хьюди

Нет. (Если вы не хотите сравнивать с nohup и &).
Хенн

7

Я обнаружил, что некоторые программы, которые я запускаю, оставляют процессы запущенными, и окно консоли не будет закрываться, пока они не завершатся, если я просто запустите их, запустив исполняемый файл.

Программа START исправляет это, но старая проблема с START все еще существует. Вы не можете просто использовать:

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

Первым параметром START остается имя окна. Если вы пропустите его, вы просто откроете консоль CMD с окном, в котором будет указано, что вы пытались запустить. В приведенном выше примере у меня теперь есть консольное окно с заголовком окна « c: \ my dir \ myfile.exe ». Не то, что я хотел!

Чтобы пропустить имя окна, просто используйте пару двойных кавычек для определения пустой строки, например:

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

Наконец, завершите ваш командный файл командой EXIT, чтобы убедиться, что он закрывается.

Этот метод работает последовательно в Windows 7 и 8.

Для устранения неполадок я обнаружил, что добавление ECHO того, что я собираюсь сделать, и TIMEOUT того, что я только что сделал, очень помогает. Например:

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

Поскольку тайм-аут дает вам обратный отсчет, вам не нужно ECHO, что вы собираетесь отложить.


5

Также - всегда используйте EXIT , под Windows 7, так как простое получение до конца командного файла не обязательно прекращает его - как в более ранних версиях Windows. Windows 7 может быть более чувствительной к этому, чем более ранние версии NT (например, Windows 2000 Professional). Это упоминалось в некоторых, но не во всех предыдущих ответах.

Детали личного опыта в поддержку ответа:

После переноса установки StarOffice5.2 из Windows 2000 в Windows 7 я получал ошибки пространства памяти при завершении работы пакета. Это не было видно в Windows 2000.

Несколько лет назад я написал пакетные файлы для автоматического резервного копирования и восстановления soffice.ini, чтобы разрешить восстановление, если оно повреждено (достаточно часто, чтобы вызвать проблемы - пакет не загружается). Однако автоматическое резервное копирование (инициируемое ссылкой на командный файл, помещенное в Office52 \ user \ config \ startup) происходит только после 5-секундной задержки. Я заметил, что всякий раз, когда я выходил из пакета непосредственно перед запуском пакетного файла, завершение пакета проходило без ошибок. Это указало мне на проблему в пакетных файлах.

После того, как команда «EXIT» была помещена как последняя строка в пакетных файлах, офисный пакет начал завершаться без сообщений об ошибках пространства памяти, независимо от того, были запущены пакетные файлы или нет.


2

Как только приложение готово, оно должно выйти. Вы уверены, что приложение Java завершается правильно?


2

Я просто имел дело с той же проблемой, и она наконец разрешилась после внесения в пакетный файл того, что казалось случайным изменением - я не понимаю почему, но я опубликую это здесь на случай, если это поможет кому-то еще позже.

Я использую утилиту SysInternals Pskill и утилиту сна, так как XP Home не включает в себя многое с точки зрения функциональности командной строки.


Это пакетный файл, который фактически закрывается после того, как это сделано:

@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

Если бы я изменил последние несколько строк следующим образом, окно cmd будет оставаться открытым, пока я не нажму «X» в углу:

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

Даже когда я пытался вызвать pskill, чтобы убить себя, процесс cmd.exe исчезал из диспетчера задач, и pskill сообщал изнутри своего cmd.exe, что процесс cmd.exe был убит, но cmd.exeокно все равно оставалось до тех пор, пока Я нажал «Х» в углу:

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

После добавления && exitкаждой строки я заметил, что некоторые из них ответили на нее и прервали пакетную обработку, а другие - нет.

Так что я просто положил один из отзывчивых в конце вместо того, как у меня это было изначально.

Как я уже сказал, я не знаю почему, но я рад, что с этим покончено.


1
Это так ненужно .
Surfasb

&& выход работает для меня
Jekcom


0

Вот как я это сделал:

  1. Создайте командный файл со следующим содержимым:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. В вашем входном потоке выхода добавьте:

    System.exit(1);
    

0

Windows 2003 не имеет «учетных записей пользователей» в панели управления по умолчанию. Я написал короткий пакет, чтобы открыть учетные записи пользователей:

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

Все работало хорошо, учетные записи пользователей открылись, но окно CMD также оставалось открытым. После некоторого исследования я добавил: START "" в начало строки 2 примерно так:

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

Теперь открывается окно «Учетные записи пользователей», остается открытым, а окно CMD закрывается. Очень просто.


0

Я искал и искал решение, чтобы закрыть окно пакетного файла, когда команда EXIT оставляет окно открытым по неизвестной причине. Я наконец наткнулся на решение.

Удалите EXIT из конца командного файла и используйте:

Taskkill /IM conhost.exe /F

0

Я создал командный файл net use на 32-битной машине с Windows 7, и cmd командного файла не завершится после выполнения. Я запускаю тот же командный файл на другом 64-разрядном компьютере с Windows 7, и cmd командного файла завершается нормально.

Я попробовал предложение Брайана, и оно не работает на этом 32-разрядном компьютере с Windows 7, потому что не было процесса conhost.exe, поэтому я изменил его следующим образом:

Taskkill /IM cmd.exe /F

Пакетный файл net use не всегда завершается нормально и показывает случайное подтверждение «Завершить пакетное задание (Y / N)» .

В соответствии с этой веткой я изменил командный файл следующим образом:

@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

Пакетный файл net use в конце концов завершается нормально.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.