2010-09-25 04:19:24 +0000 2010-09-25 04:19:24 +0000
25
25
Advertisement

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

Advertisement

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

Я пытался:

"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
Advertisement
Advertisement

Ответы (11)

31
31
31
2010-09-25 07:28:36 +0000

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

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

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

20
20
20
2012-01-26 01:17:52 +0000

Пояснение:

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

Решение:

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

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

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

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

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

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

7
Advertisement
7
7
2013-05-15 23:43:30 +0000
Advertisement

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

Программа 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 того, что я собираюсь сделать, а затем ВРЕМЕНИ того, что я только что сделал, очень помогает. Например:

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

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

5
5
5
2012-01-26 00:59:18 +0000

Также – используйте 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
Advertisement
2
2
2010-11-06 03:27:04 +0000
Advertisement

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

я использую утилиту SysInternals Pskill и утилиту sleep , так как в 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. Например, процесс 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 в каждую строку, я заметил, что некоторые из них ответили на него и прервали пакетную обработку, в то время как другие нет.

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

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

2
2
2
2010-09-25 04:29:25 +0000

Как только приложение будет готово, оно должно выйти. Вы уверены, что Java-приложение выходит должным образом?

1
Advertisement
1
1
2010-09-25 04:51:34 +0000
Advertisement

Попробуй:

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

0
0
0
2015-10-16 12:53:17 +0000

В 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 закрывается. Easy Peasy.

0
Advertisement
0
0
2016-01-01 06:06:20 +0000
Advertisement

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

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

Taskkill /IM conhost.exe /F
0
0
0
2016-07-15 10:37:30 +0000

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

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

Taskkill /IM cmd.exe /F

Сетевой пакетный файл использования не всегда выходит нормально и показывает подтверждение “Завершить пакетное задание (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

Сетевой пакетный файл использования всего выходит нормально.

0
0
0
2014-06-21 17:43:16 +0000

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

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

  2. В вашем выходном входном потоке добавьте:

Advertisement

Похожие вопросы

3
28
13
7
8
Advertisement