เหตุใด 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คำสั่งในตัวคำสั่งที่ spawns กระบวนการ (พื้นเช่นการเรียกใช้โปรแกรมจากเมนู Start) ดังนั้นสิ่งที่เกิดขึ้นในบริบทนี้คือตัวประมวลผลแบตช์รันstartคำสั่งซึ่งจะรันโปรแกรมที่ระบุและยุติ (ตัวเองไม่ใช่โปรแกรมที่เกิด) ดังนั้นโปรเซสเซอร์แบบแบตช์จะดำเนินต่อไปตามที่คาดไว้ นอกจากนี้ยังมีตัวเลือกบางอย่างที่มีประโยชน์เช่นการเรียกใช้โปรแกรมย่อขนาดเล็กสุด ( /min) หรือขยายใหญ่สุด ( /max) ขยายใหญ่สุดใช้งานในลำดับความสำคัญต่ำ ( /low) และอื่น ๆ ดูstart /?รายละเอียดที่


เราสามารถพิจารณาเริ่มต้นเช่นnohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy

ไม่ (ยกเว้นว่าคุณต้องการเปรียบเทียบกับ nohup และ &)
Hennes

7

ฉันได้พบว่าบางโปรแกรมที่ฉันเปิดใช้กระบวนการปล่อยทำงานและหน้าต่างคอนโซลจะไม่ปิดจนกว่าพวกเขาจะยุติหากฉันเพียงแค่เรียกใช้พวกเขาด้วยการเปิดตัวปฏิบัติการ

โปรแกรม 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และยูทิลิตีsleepเนื่องจาก XP Home ไม่ได้รวมฟังก์ชันการใช้คำสั่งมากมายนัก


นี่คือ batchfile ที่ปิดจริงหลังจากเสร็จสิ้น:

@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

&& exit ทำงานให้ฉัน
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 ยังคงเปิดอยู่เช่นกัน หลังจากการวิจัยที่นี่ฉันเพิ่ม: เริ่มต้น "" ไปที่จุดเริ่มต้นของบรรทัด 2 เช่น:

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

ตอนนี้หน้าต่างบัญชีผู้ใช้จะเปิดขึ้นยังคงเปิดอยู่และหน้าต่าง CMD จะปิดลง ง่าย Peasy


0

ฉันค้นหาและค้นหาวิธีแก้ไขเพื่อปิดหน้าต่างไฟล์แบตช์เมื่อคำสั่ง EXIT เปิดหน้าต่างทิ้งไว้โดยไม่ทราบสาเหตุ ในที่สุดฉันก็สะดุดกับทางออก

ลบ EXIT ออกจากท้ายไฟล์แบตช์และใช้:

Taskkill /IM conhost.exe /F

0

ฉันสร้างไฟล์แบ็ตช์การใช้งานเน็ตบนเครื่อง Windows 7 32 บิตและ cmd ของไฟล์แบทช์จะไม่ออกหลังจากทำงาน ฉันเรียกใช้ไฟล์แบตช์เดียวกันในเครื่อง Windows 7 64 บิตเครื่องอื่นและ cmd ของไฟล์แบตช์ออกจากปกติ

ฉันลองใช้คำแนะนำของ Bryanและมันไม่ทำงานบนเครื่อง 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

ไฟล์แบ็ตช์การใช้เน็ตในที่สุดก็ออกจากปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.