Чому після виконання пакетного файлу не вийде 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

Як згадував Терранс , ""це назва, яку слід використовувати для вікна консолі. Однак це необов'язково, лише якщо команда не в лапках; в іншому випадку не потрібно . Ви можете покласти щось там, якщо вам подобається, або залишити його порожнім, але якщо команда є в лапках, вона повинна бути присутнім, інакше команда-інтерпретатор буде розглядати цитовану команду як заголовок і відкриє консоль, яка просто сидить там і чекає щось робити.

Натомість ви можете використовувати щось із наведеної нижче команди, але цитати просто простіші та безпечніші, оскільки короткі імена не гарантуються однаковими для кожної системи.

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

startКоманда є вбудованої командою , яка нереститься процес ( в основному , як і запуск програми з меню Пуск). Тож, що відбувається в цьому контексті, це те, що пакетний процесор виконує startкоманду, яка в свою чергу запускає вказану програму і припиняється (сама, а не породжена програма). Таким чином, пакетний процесор продовжується так, як очікувалося. Він також має деякі варіанти, які можуть бути корисними, наприклад, запуск програми з мінімізацією ( /min) або максимізація ( /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 того, що я збираюся зробити, то ЧАС того, що я щойно зробив, дуже допомагає. Наприклад:

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
Це так непотрібно .
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 "" до початку другого рядка так:

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

Тепер відкриється вікно Облікові записи користувачів, залишається відкритим і вікно CMD закривається. Простенька.


0

Я шукав і шукав рішення закрити вікно пакетного файлу, коли команда EXIT залишає вікно відкритим з невідомих причин. Нарешті я натрапив на рішення.

Видаліть EXIT з кінця пакетного файлу та скористайтеся:

Taskkill /IM conhost.exe /F

0

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

Я спробував пропозицію Брайана, і він не працює на тому Windows 7 32-розрядній машині, оскільки не було процесу 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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.