Tại sao sẽ không thoát cmd sau khi thực hiện tệp bó?


25

Tại sao sẽ không thoát cmd sau khi thực hiện tệp bó?

Tôi đã thử:

"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

Câu trả lời:


31

Nếu ứng dụng Java không chấm dứt (ví dụ: bạn đang sử dụng tệp bó để khởi chạy ứng dụng Java), thì hãy sử dụng startlệnh để khởi chạy nó: -

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

Điều này sẽ khởi chạy ứng dụng java và tiếp tục thực hiện tệp bó mà không cần chờ ứng dụng java kết thúc.


20

Giải trình:

Đây là cách nó làm việc; một tệp bó được xử lý một dòng tại một thời điểm. Mỗi lệnh được thực hiện lần lượt và bộ xử lý hàng loạt chờ một lệnh kết thúc trước khi bắt đầu lệnh tiếp theo. Vấn đề bạn gặp phải là vì ứng dụng Java mà bạn đang khởi chạy (Jilko.jar) là một chương trình có cửa sổ tiếp tục chạy ngay cả sau khi dòng khởi chạy nó. Nếu đó là một công cụ thực hiện một số hành động và sau đó chấm dứt, tệp bó sẽ tiếp tục với lệnh tiếp theo (hoặc thoát nếu không còn nữa). Vì chương trình vẫn đang chạy, bộ xử lý hàng loạt chờ cho đến khi cửa sổ được đóng trước khi tiếp tục. Bạn có thể thấy điều này trong thực tế bằng cách thoát khỏi chương trình Java: cửa sổ giao diện điều khiển với tệp bó sau đó đóng lại.


Dung dịch:

Những gì bạn cần làm để khắc phục nó, là hướng dẫn bộ xử lý hàng loạt khởi chạy chương trình và tiếp tục mà không cần chờ đợi như sau:

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

Như Terrance đã đề cập , ""tiêu đề là sử dụng cho cửa sổ giao diện điều khiển. Tuy nhiên, nó chỉ là tùy chọn nếu lệnh không được trích dẫn; cách khác là cần thiết . Bạn có thể đặt một cái gì đó vào đó nếu bạn thích hoặc để trống, nhưng nếu lệnh được trích dẫn, nó phải có mặt, nếu không, trình thông dịch lệnh sẽ coi lệnh được trích dẫn là tiêu đề và mở một giao diện điều khiển chỉ ngồi đó chờ một cái gì đó để làm.

Bạn có thể sử dụng một cái gì đó theo lệnh sau, nhưng các trích dẫn chỉ dễ dàng và an toàn hơn vì tên ngắn không được đảm bảo giống nhau trên mọi hệ thống.

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

Các startlệnh là một built-in lệnh spawn một quá trình (cơ bản giống như chạy một chương trình từ menu Start). Vì vậy, những gì xảy ra trong bối cảnh này là bộ xử lý hàng loạt chạy startlệnh lần lượt chạy chương trình đã chỉ định và chấm dứt (chính nó, không phải chương trình sinh ra). Như vậy, bộ xử lý hàng loạt tiếp tục như mong đợi. Nó cũng có một số tùy chọn có thể hữu ích như chạy chương trình thu nhỏ ( /min) hoặc tối đa hóa ( /max), chạy ở mức ưu tiên thấp ( /low), v.v. Xem start /?để biết chi tiết.


Chúng ta có thể xem xét bắt đầu như nohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy

Không (Trừ khi bạn muốn so sánh với nohup và &).
Hennes

7

Tôi đã thấy rằng một số chương trình tôi khởi chạy để lại các tiến trình đang chạy và cửa sổ giao diện điều khiển sẽ không đóng cho đến khi chúng kết thúc nếu tôi chỉ chạy chúng bằng cách khởi chạy chương trình thực thi.

Chương trình START khắc phục điều đó, nhưng vấn đề cũ với START vẫn còn đó. Bạn không thể chỉ sử dụng:

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

Tham số đầu tiên của START vẫn là tên cửa sổ. Nếu bạn bỏ qua nó, bạn chỉ cần mở một hộp điều khiển CMD với cửa sổ có tên bất cứ thứ gì bạn đã cố gắng khởi chạy. Trong trường hợp trên, bây giờ tôi có một cửa sổ giao diện điều khiển với tiêu đề cửa sổ là " c: \ my dir \ myfile.exe ". Không phải những gì tôi muốn!

Để bỏ qua tên cửa sổ, chỉ cần sử dụng một cặp dấu ngoặc kép để xác định một chuỗi trống, chẳng hạn như:

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

Cuối cùng, kết thúc tệp bó của bạn bằng lệnh EXIT để đảm bảo nó đóng.

Phương pháp này dường như hoạt động nhất quán trong Windows 7 và 8.

Để khắc phục sự cố, tôi thấy rằng việc thêm ECHO về những gì tôi sắp làm, sau đó THỜI GIAN về những gì tôi vừa làm, sẽ giúp ích rất nhiều. Ví dụ:

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

Vì Hết giờ cho bạn đếm ngược, bạn không cần phải ECHO mà bạn sắp trì hoãn.


5

Ngoài ra - sử dụng EXIT mọi lúc, trong Windows 7, vì chỉ đến cuối tệp bó không nhất thiết phải chấm dứt - như trong các phiên bản Windows trước. Windows 7 có thể nhạy cảm hơn với phiên bản NT trước đó (ví dụ Windows 2000 Professional). Điều này đã được đề cập trong một số, nhưng không phải tất cả các câu trả lời trước đó.

Chi tiết kinh nghiệm cá nhân để hỗ trợ trả lời:

Sau khi chuyển cài đặt StarOffice5.2 từ Windows 2000 sang Windows 7, tôi đã gặp lỗi không gian bộ nhớ khi kết thúc bộ. Điều này đã không được nhìn thấy trong Windows 2000.

Cách đây nhiều năm, tôi đã viết các tệp bó để tự động sao lưu và khôi phục soffice.ini, để cho phép sửa chữa khi nó bị hỏng (thường đủ để trở thành sự cố - bộ không tải được). Tuy nhiên, sao lưu tự động (được kích hoạt bởi một liên kết đến tệp bó, được đặt trong Office52 \ user \ config \ startup) chỉ xảy ra sau khoảng thời gian trễ 5 giây. Tôi nhận thấy bất cứ khi nào tôi thoát khỏi bộ ngay trước khi tệp bó chạy, việc chấm dứt của bộ không có lỗi. Điều này chỉ cho tôi một vấn đề trong các tập tin bó.

Sau khi Lệnh 'EXIT' được đặt làm dòng cuối cùng trên các tệp bó, bộ công cụ văn phòng bắt đầu chấm dứt mà không có thông báo lỗi không gian bộ nhớ, mọi lúc, cho dù Tập tin Batch có chạy hay không.


2

Khi ứng dụng được hoàn thành, nó sẽ thoát. Bạn có chắc chắn ứng dụng Java đang thoát đúng không?


2

Tôi chỉ đang giải quyết vấn đề tương tự, và cuối cùng nó cũng tự giải quyết sau khi thực hiện những thay đổi ngẫu nhiên cho đợt này - Tôi không hiểu tại sao nhưng tôi sẽ đăng nó ở đây trong trường hợp nó giúp được người khác sau.

Tôi sử dụng tiện ích SysIternals Pskill và tiện ích ngủ vì XP Home không bao gồm nhiều về chức năng dòng lệnh.


Đây là gói hàng thực tế đóng sau khi hoàn thành:

@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

Nếu tôi có một vài dòng cuối cùng thay đổi như thế này, cửa sổ cmd sẽ vẫn mở cho đến khi tôi nhấp vào 'X' ở góc:

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

Ngay cả khi tôi đã cố gắng gọi pskill để tự giết mình, quá trình cmd.exe sẽ biến mất khỏi Trình quản lý tác vụ và pskill sẽ báo cáo từ bên trong cmd.exe rằng quá trình cmd.exe đã bị giết, nhưng cmd.execửa sổ vẫn duy trì cho đến khi Tôi đã nhấp vào 'X' ở góc:

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

Sau khi tôi thêm && exitvào mỗi dòng, tôi nhận thấy một số trong số họ đã phản hồi và sẽ làm gián đoạn quá trình xử lý hàng loạt - trong khi những người khác thì không.

Vì vậy, tôi chỉ đặt một trong những phản hồi cuối cùng thay vì cách tôi có nó ban đầu.

Như tôi đã nói, tôi không biết tại sao, nhưng tôi mừng vì điều này đã kết thúc.


1
Điều này là không cần thiết .
Surfasb

&& exit hoạt động với tôi
jekcom

1

thử:

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


0

Đây là cách tôi đã làm nó:

  1. Tạo một tệp bó với các nội dung sau:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. Trong luồng đầu vào thoát của bạn, thêm:

    System.exit(1);
    

0

Windows 2003 không có "Tài khoản người dùng" trong Bảng điều khiển theo mặc định. Tôi đã viết một đợt ngắn để mở Tài khoản người dùng:

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

Nó hoạt động tốt, Tài khoản người dùng đã mở, nhưng cửa sổ CMD vẫn mở. Sau một số nghiên cứu ở đây, tôi đã thêm: BẮT ĐẦU "" vào đầu dòng 2 như vậy:

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

Bây giờ cửa sổ Tài khoản người dùng mở, vẫn mở và cửa sổ CMD đóng. Dễ như ăn bánh.


0

Tôi đã tìm kiếm và tìm kiếm một giải pháp để đóng một cửa sổ tệp bó khi lệnh EXIT để cửa sổ mở mà không rõ lý do. Cuối cùng tôi cũng vấp phải một giải pháp.

Xóa EXIT khỏi phần cuối của tệp bó và sử dụng:

Taskkill /IM conhost.exe /F

0

Tôi đã tạo một tệp bó sử dụng ròng trên máy Windows 7 32 bit và cmd của tệp bó sẽ không thoát sau khi thực thi. Tôi chạy cùng một tệp bó trên một máy Windows 7 64 bit khác và cmd của tệp bó thoát ra bình thường.

Tôi đã thử đề xuất của Bryan và nó không hoạt động trên máy Windows 7 32 bit đó vì không có quá trình conhost.exe nên tôi đã sửa đổi nó như sau:

Taskkill /IM cmd.exe /F

Tệp bó sử dụng mạng không phải lúc nào cũng thoát bình thường và nó hiển thị xác nhận ngẫu nhiên "Chấm dứt công việc hàng loạt (Y / N)" .

Theo chủ đề này, tôi đã sửa đổi các tập tin bó như sau:

@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

Các tập tin sử dụng mạng cuối cùng thoát bình thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.