23

Почему 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

11 ответов11

29

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

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

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

19

Объяснение:

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


Решение:

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

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

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

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

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

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

6

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

Программа 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 все равно будет оставайся до тех пор, пока я не нажму 'X' в углу:

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

пытаться:

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

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 в конце концов завершается нормально.

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 закрывается. Очень просто.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .