วิธีป้องกันการปิดคอนโซลอัตโนมัติหลังจากเรียกใช้แบตช์ไฟล์


510

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


5
มันจะดีถ้ามีวิธีการตรวจสอบว่าไฟล์. cmd เริ่มต้นโดย doubleclick ใน explorer (จากนั้นคุณต้องการให้มันหยุดในตอนท้าย) หรือถ้ามันเริ่มต้นด้วยบรรทัดคำสั่งที่เปิดอยู่แล้ว ในกรณีต่อมา (และโดยเฉพาะอย่างยิ่งถ้าดำเนินการโดยโปรแกรมอื่น) คุณไม่ต้องการหยุดชั่วคราว ฉันไม่พบวิธีแก้ปัญหาที่ดีสำหรับกรณีนี้ (และโดยทั่วไปจะใช้ตัวแปร if NOPAUSE% แต่วิธีนี้ใช้ได้เฉพาะกับโปรแกรมหลักที่ไม่ใช่สำหรับเชลล์ paremt)
eckes

1
มีวิธีคือ: stackoverflow.com/questions/3551888/…
EM0

คำตอบ:


635

ในไฟล์แบตช์ Windows / DOS:

pause

นี่พิมพ์"Press any key to continue . . . "ข้อความที่ดี

หรือถ้าคุณไม่ต้องการ"Press any key to continue . . ."ข้อความให้ทำสิ่งนี้แทน:

pause >nul

14
ข้อเสนอแนะที่นี่ไม่ทำงานสำหรับฉันเมื่อดับเบิลคลิกที่ไฟล์ bat เป็นสภาพแวดล้อมเซิร์ฟเวอร์ (และฉันต้องเรียกใช้สคริปต์ในนั้น) เพื่อให้พวกเขาสามารถแก้ไขพฤติกรรม แต่นั่นไม่ได้เปลี่ยนเป้าหมายของฉัน เพื่อให้หน้าต่างคำสั่งเปิดอยู่ดังนั้นฉันจึงสามารถพิมพ์ข้อความแสดงข้อผิดพลาดได้
Henrik Erlandsson

1
ใช่มันไม่ได้ขึ้นอยู่กับสภาพแวดล้อมเสมอไป สำหรับคำตอบที่มีประสิทธิภาพยิ่งขึ้นดูคำตอบของฉันด้านล่าง เป็นหลักเพียงทำ set / p exitkey = "กดปุ่มใดก็ได้เพื่อดำเนินการต่อ ... "
สตีเวนมาร์คฟอร์ด

ระวังถ้ามีคนรันสคริปต์ของคุณโดยไม่มีหน้าต่างคอนโซล (เช่นผ่าน vbscript) มันจะหยุดทำงานจนกว่าคุณจะฆ่ามันผ่าน Task Manager
Andry

ถ้ามันเป็นเหมือน Maven ใช้ CALL, stackoverflow.com/a/52205298/4485678
Kevin Roy

หยุดทำงานอย่างสมบูรณ์แบบที่นี่
Davidson Lima

141

ขึ้นอยู่กับคำถามที่แน่นอน!

โดยปกติpauseจะทำงานภายในไฟล์. bat

หากคุณต้องการให้cmd.exeไม่สามารถปิดการพิมพ์ให้ใช้cmd /kคำสั่งที่ท้ายไฟล์


2
หากคุณใช้คำสั่ง Windows ผ่านกล่องโต้ตอบเรียกใช้ให้ใส่cmd /kคำสั่งของคุณแทน & cmd /kจะไม่ทำงาน
Noumenon

68

หากคุณต้องการให้ cmd.exe ไม่ปิดและสามารถพิมพ์ต่อไปได้ให้ใช้ cmd /k

เพิ่งรู้สึกว่าจำเป็นต้องชี้แจงสิ่งที่/kไม่ (จากเว็บไซต์ windows):

/k : ดำเนินการคำสั่งที่ระบุโดยสตริงและดำเนินการต่อ

ดังนั้นcmd /kหากไม่มีคำสั่งติดตามที่ท้ายไฟล์ bat จะcmd.exeเปิดหน้าต่างค้างไว้เพื่อใช้ต่อไป

ในอีกทางหนึ่งpauseในตอนท้ายของไฟล์แบทช์ก็จะหยุดกระบวนการและหยุดcmd.exeในการกดปุ่มแรก


24

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

start "title" call abcd.exe param1 param2  
start "title" call xyz.exe param1 param2

2
ในกรณีของฉันฉันมีข้อผิดพลาดระหว่างเรียกใช้คำสั่งเทอร์มินัลดังนั้นคำสั่ง 'หยุดชั่วคราว' และ 'cmd / k' ไม่ได้ช่วยให้ฉันหยุดโปรแกรม 'สาเหตุของข้อผิดพลาด ตัวอย่างนี้ช่วยให้ฉันแสดงฉันมีข้อผิดพลาดและหยุดไปค่อนข้างจากสถานี ขอบคุณ!
HowDoYouTellForAChild

19

หากคุณใช้Mavenและคุณต้องการข้ามการพิมพ์และป้องกันไม่ให้คอนโซลเข้ามาใกล้เพื่อดูผลลัพธ์ที่คุณต้องใช้CALLคำสั่งในสคริปต์นอกเหนือจาก 'mvn clean install'

เช่นนี้จะปิดคอนโซล

ECHO This is the wrong exemple
mvn clean install
pause

เช่นนี้คอนโซลจะยังคงเปิดอยู่

ECHO This is the right exemple
CALL mvn clean install
pause

หากคุณไม่ใช้CALLคำสั่งตัวอย่างที่ผ่านมาจะไม่ทำงาน


1
ขอบคุณมาก! จะป้องกันไม่ให้พรอมต์ปิดหากคำสั่งล้มเหลว
Timur Gilauri

1
มันใช้งานได้สำหรับฉัน ฉันต้องการรันคำสั่ง differents 2 ไฟล์ในไฟล์ bat 1 ไฟล์ แต่พรอมต์ของฉันปิดหลังจากคำสั่งแรก การcall <myCommand>แก้ไขปัญหานี้ทำให้การแจ้งเตือนของฉันหยุดลงหลังจากการดำเนินการครั้งแรก
Zombkey

1
คำตอบที่มีประโยชน์มากที่สุด
gianmarcocalbi

14

เพิ่มcmd.exeเป็นบรรทัดใหม่ด้านล่างรหัสที่คุณต้องการดำเนินการ:

c:\Python27\python D:\code\simple_http_server.py

cmd.exe

นี่คือสิ่งที่ฉันกำลังมองหาขอบคุณ! "หยุด" จะไม่ทำงานเมื่อสคริปต์ python ของคุณทำงานล้มเหลว สิ่งที่ฉันต้องการคือการเห็นข้อความแสดงข้อผิดพลาด จนถึงตอนนี้ฉันต้องรันสคริปต์ python ของฉันผ่านคอนโซล
user70960

แต่ใช้งานได้ดี:python script.py %1 && cmd
70960

ขอบคุณ! สิ่งนี้ช่วย! ฉันกำลังสร้างแบตช์ไฟล์เพื่อเรียกใช้แอปพลิเคชันหลาม
fez.tival

10

วิธีของฉันคือการเขียนแบทช์จริง (พูดว่า "foo.bat") เพื่อให้งานเสร็จ; จากนั้นสร้าง "start.bat" อื่น:

@echo off
cmd /k foo.bat

ฉันพบว่าสิ่งนี้มีประโยชน์อย่างยิ่งเมื่อฉันตั้งค่าตัวแปรสภาพแวดล้อมแบบครั้งเดียว


1
คุณสามารถใส่cmd /k(ไม่มีคำสั่งใด ๆ ) ที่ส่วนท้ายของfoo.batไฟล์และเรียกใช้ คุณไม่ต้องการstart.batไฟล์แยกต่างหาก
ADTC


5

นอกจาก pauseนี้

set /p=

สามารถใช้งานได้มันจะคาดว่าอินพุตของผู้ใช้และจะปล่อยโฟลว์เมื่อกดถูกป้อน

หรือ

runas /user:# "" >nul 2>&1

ซึ่งจะทำเช่นเดียวกันยกเว้นสิ่งใดจากอินพุตของผู้ใช้จะถูกแสดงและจะยังคงอยู่ในประวัติคำสั่ง


3

ความเป็นไปได้ที่ 1: สร้างไฟล์. bat เพียง 2 ไฟล์แล้วเขียนลงในไฟล์แรก:

start <filename> // name of 2nd batch file
exit

ไฟล์แบทช์ 2 เป็นไฟล์ที่จะไม่ปิดท้าย ดังนั้นเมื่อคุณเปิดแบทช์ nr.1 มันจะเริ่มต้นที่ 2 และปิดบังตัวเอง เมื่อเสร็จสิ้นครั้งที่ 2 มันจะไม่ปิดลงอย่างสมบูรณ์ (ตราบใดที่คุณไม่ต้องออกทางออกในตอนท้าย)

ความเป็นไปได้ที่ 2: ไฟล์แบตช์ 1:

call <filename>
cls
echo End of file
pause
<any code you want>

เมื่อไฟล์ที่ 2 สิ้นสุดลงไฟล์นั้นจะไปยังไฟล์ 1 อีกครั้งและส่งออกส่วนที่เหลือของไฟล์ โดยที่คุณสามารถสร้างตัวจัดการข้อผิดพลาดได้ หาก nr.1 ขัดข้องมันจะเข้าสู่ nr.2 และแสดง


2

แฮ็คตัวเล็กนี้ขอให้ผู้ใช้ป้อนรหัสและเก็บไว้ในตัวแปร% exitkey% (ตัวแปรนี้สามารถเรียกได้ว่าอะไรก็ได้ที่คุณชอบ)

set /p exitkey= "Press any key to continue..."

หมายเหตุ: ช่องว่างหลังจาก '=' นั้นสำคัญมาก



2

ฉันรู้ว่าฉันมาช้า แต่วิธีที่ฉันชอบคือ:

:programend
pause>nul
GOTO programend

ด้วยวิธีนี้ผู้ใช้ไม่สามารถออกโดยใช้ Enter


ฉันคิดว่าใช่เพราะมันเป็นวิธีที่ได้รับการปรับปรุงเพื่อป้องกันไม่ให้คอนโซลปิด แม้ว่าผู้ใช้กดปุ่มใดก็ตามคอนโซลยังคงเปิดอยู่ ผู้ใช้จะถูกบังคับให้ออกเท่านั้นโดยการปิดหน้าต่างคอนโซล
decadenza

2

มีปัญหากับคำตอบที่นี่ดังนั้นฉันจึงได้สิ่งนี้ซึ่งเหมาะกับฉัน (TM):

cmd /c node_modules\.bin\tsc
cmd /c node rollup_build.js
pause

1

มีสองวิธีที่จะทำมันขึ้นอยู่กับกรณีการใช้งาน

1) ถ้าคุณต้องการให้พรอมต์ Windows cmd เปิดอยู่เพื่อให้คุณเห็นผลการดำเนินการและปิดหลังจากนั้น ใช้

pause

2) ถ้าคุณต้องการให้ Windows cmd prompt เปิดอยู่และให้คุณสามารถรันคำสั่งบางคำสั่งได้ ใช้

cmd

ป้อนคำอธิบายรูปภาพที่นี่


1

ง่าย ๆ เพิ่มคำสั่งลงในค้างคาวบรรทัดสุดท้ายของคุณ แต่! หากคุณรีเซ็ตหรือล้างเส้นทางระบบของคุณคุณต้องเริ่มต้น cmd ด้วยเส้นทางแบบเต็มเช่น:

%windir%\system32\cmd.exe

ตัวอย่างเช่นฉันมีไฟล์ bat เพื่อรีเซ็ต jdk เป็นเวอร์ชันเก่าเช่นนี้:

PATH=C:\Program Files\Java\jdk1.6.0_45\bin;C:\apache-ant-1.7.1\bin
SET JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45
%windir%\system32\cmd.exe

เนื่องจากฉันรีเซ็ตเส้นทางของระบบฉันต้องเรียกใช้ cmd ด้วยเส้นทางแบบเต็มหรือระบบไม่สามารถหา cmd.exe ได้มันจะล้มเหลวในการเรียกใช้ cmd และเพียงแค่ปิดหน้าต่างแล้วคุณจะไม่เห็นข้อผิดพลาด msg .

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