จะยกเลิกการยืนยัน“ ยุติแบทช์งาน (Y / N)” ได้อย่างไร?


153

ใน cmd เมื่อเรากด Ctrl + C เราจะได้รับแอปพลิเคชันเป้าหมายถูกยกเลิก แต่ถ้าแอปพลิเคชันเป้าหมายถูกเรียกจากแบตช์ไฟล์เราจะได้รับการยืนยัน "ยุติแบทช์งาน (Y / N)" ฉันไม่สามารถจำอินสแตนซ์ที่ฉันเลือกที่จะไม่ยกเลิกงานแบ็ตช์ได้ เราจะข้ามการยืนยันนี้ไปได้อย่างไร?


คุณเคยลองคำตอบของ sgmoore ไหม? superuser.com/questions/35698/...
Arjan

10
"ฉันจำไม่ได้ว่ามีอินสแตนซ์ที่ฉันเลือกที่จะไม่ยกเลิกงานแบตช์" และที่จริงแล้วในกรณีส่วนใหญ่งานจะถูกยกเลิกแม้ว่าคุณจะตอบ No ...
PhiLho

@PhiLho - นั่นไม่เป็นความจริงเพราะสคริปต์ของฉันจะดำเนินต่อไปหลังจากที่ฉันเข้าNมา Nฉันอยากรู้ว่าสิ่งที่คุณมีสถานการณ์ที่สคริปต์ชุดสิ้นสุดลงหลังจากที่คุณใส่
dbenham

ฉันหวังว่านี่จะเป็นเรื่องง่าย แต่ตามปกติ Microsoft ได้ทำเรื่องง่าย ๆ ในลา คำตอบด้านล่างนี้เป็นวิธีที่ใช้ความพยายามมากเกินไปที่จะหลีกเลี่ยงความรำคาญเล็กน้อย ฉันแค่รำคาญที่ไม่มีวิธีง่ายๆในการแก้ไขปัญหานี้ Microsoft อย่างจริงจังจุดประสงค์ของพรอมต์นี้คืออะไร ใช่ฉันแน่ใจว่านั่นเป็นเหตุผลที่ฉันกด Ctrl + C ...
Chev

ปัญหานี้เป็นอย่างน้อยทำให้ฉันจำและใช้-nสวิตช์สำหรับ cygwin pingบ่อยขึ้น
palswim

คำตอบ:


53

AFAIK คุณไม่สามารถทำได้เนื่องจากพฤติกรรมนี้เกิดจากการออกแบบและควบคุมโดยล่ามคำสั่ง ไม่มีวิธี "แมป" หรือแม้แต่ "ดัก" สิ่งนี้เว้นแต่ว่าคุณจะรวบรวมและแปลล่ามโดยตรง


39
เป็นเรื่องที่น่าผิดหวัง: (
Srikanth

ใช่มันน่าผิดหวัง สิ่งที่น่าผิดหวังยิ่งกว่าก็คือคำสั่ง BREAK ซึ่งโดยค่าเริ่มต้นจะไม่ทำอะไรภายใต้ XP อาจถูกใช้เพื่อสลับพร้อมท์ ...
Synetech

3
แม้ว่ามันอาจจะเป็นหนึ่งที่แท้จริงไม่สามารถทำให้การทำงานของล่ามที่แตกต่างกันโดยใช้startเช่น sgmoore ปัญหาที่superuser.com/questions/35698/...ดูเหมือนว่าวิธีแก้ปัญหาที่ดีอย่างสมบูรณ์กับฉัน
Arjan

1
นี่คือ: superuser.com/a/498798/56101
Totty.js

57

กดCtrl+ Cสองครั้ง


5
สิ่งนี้จะใช้งานไม่ได้ แต่จะแจ้งให้ทำซ้ำ
Joey

8
ฉันเพิ่งฆ่าฐานข้อมูลของฉันด้วยการทำเช่นนั้น! สคริปต์กำลังรอ "หยุด" ดังนั้นฉันจึงทำ CTRL-C จากนั้นพรอมต์ก็มาดังนั้นฉันจึงทำ CTRL-C อีกครั้งจากนั้นแฟ้มแบตช์จะดำเนินการอย่างต่อเนื่องและลบฐานข้อมูลของฉัน! @see superuser.com/questions/740004/…
Sebastien Diot

2
นั่นไม่ใช่สิ่งที่ OP ถาม เขาสามารถพิมพ์ "N" ได้อย่างง่ายดายหลังจาก ^ C
vladr

3
@vladr ก็เพียบง่ายต่อการถือCtrlและแตะCอีกครั้งเมื่อเทียบกับการกดปุ่มแล้วY Enter
Nick T

20
@SebastienDiot คุณลองใช้เทคนิคใหม่ในสคริปต์ที่มีศักยภาพในการทำลายข้อมูลอย่างถาวรหรือไม่? นั่นคือ ... กล้าหาญ
พื้นฐาน

57

ที่เว็บไซต์นี้ฉันพบทางออกที่มีประสิทธิภาพ:

script2.cmd < nul

ไม่ต้องพิมพ์สิ่งนี้ทุกครั้งที่ฉันสร้างสคริปต์ตัวที่สองที่เรียกว่าscript.cmdในโฟลเดอร์เดียวกันโดยมีบรรทัดด้านบน ฉันได้ทดสอบเทคนิคนี้ใน XP เท่านั้น แต่คนอื่น ๆ ยืนยันใน Win 7

นาธานเพิ่ม: ตัวเลือกอื่นคือการวางรหัสต่อไปนี้ที่ด้านบนของ script.cmd ซึ่งทำสิ่งเดียวกันในไฟล์เดียว:

rem Bypass "Terminate Batch Job" prompt.
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
)

2
หากคุณเรียกไฟล์แบตช์จากภายในตัวเอง (โดยไม่ใช้คำสั่ง CALL) การดำเนินการจะถูกถ่ายโอน "ถาวร" หาก STDIN ถูกเปลี่ยนเส้นทางไปยัง NUL พรอมต์ "ยุติงานแบทช์" ใด ๆ จะยังคงปรากฏ แต่จะไม่รอ (เพราะ STDIN หายไป) สำหรับการป้อนข้อมูล มันใช้งานได้สำหรับฉัน ...
William

3
ใช้งานได้ใน Windows 7
William

17
มันใช้งานได้เว้นแต่คุณจะต้องใส่ผู้ใช้ในชุด
Augusto Men

2
@William เพียงโทรสคริปต์ที่ไม่ได้ทำงานสำหรับฉัน @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command])แต่ฉันมากับการแก้ปัญหา: เรียกตัวเองซ้ำ แต่ด้วยการโต้แย้งครั้งที่สอง หากสคริปต์ของคุณมีข้อโต้แย้งคุณอาจใช้อาร์กิวเมนต์ตำแหน่งที่ไม่ได้ใช้ครั้งแรก อาจเป็นปัญหาได้หากสคริปต์ของคุณมีข้อโต้แย้งมากมาย สคริปต์ของฉันไม่ต้องการอาร์กิวเมนต์หรืออินพุตของผู้ใช้
jpmc26

คำตอบของ jpmc เหมาะกับฉัน มันสะท้อนคำสาป Terminate (y / n) หรือไม่? ข้อความที่สิ้นสุดแล้ว แต่ไม่หยุดมัน
ggb667

28

ติดตั้งClinkและเปลี่ยนการตั้งค่า "terminate_autoanswer" ไฟล์การตั้งค่าควรอยู่ที่นี่ : C:\Users\<username>\AppData\Local\clink\settings.

# name: Auto-answer terminate prompt
# type: enum
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 1

จากนั้น "เพิ่งใช้งานได้" กับหน้าต่าง cmd.exe คุณไม่จำเป็นต้องแก้ไขสิ่งที่กำลังทำงานอยู่หรืออย่างอื่นเนื่องจากเสียงกริ๊ก piggy-backs บน cmd.exe

Frickin 'ยอดเยี่ยม IMO!


เสียงกริ๊กนั้นยอดเยี่ยม แต่มันใช้ไม่ได้กับฉันโดยใช้ cmd.exe หรือ Console2 มันยังคงถามและไม่ได้รับการป้อนอัตโนมัติ
iono

@tometoftom: คุณเปลี่ยนไฟล์การตั้งค่าข้างต้นหรือไม่? ฉันต้องทำอย่างนั้นเพื่อให้มันใช้ได้ (โปรดทราบว่าคุณต้องเป็นผู้ดูแลระบบเพื่อบันทึกไฟล์อย่างถูกต้องใน Windows Vista และใหม่กว่า ... )
Macke

3
อ่ายังไม่มีลูกเต๋า ถอนหายใจ Microsoft อย่างลึกล้ำเพื่อประโยชน์ของพระเจ้า ...
iono

3
@iono คุณมี Windows รุ่นที่ไม่ใช่ภาษาอังกฤษหรือไม่? ในกรณีนี้เสียงกริ๊กไม่สามารถตอบรับอัตโนมัติได้จนกว่า 0.4.3 จะเปิดตัวเมื่อไม่กี่วันที่ผ่านมา: github.com/mridgers/clink/releases/tag/0.4.3
schlamar

3
ที่เกี่ยวข้อง: สำหรับผู้ที่ใช้ cmder\cmder\config\settingsตั้งอยู่บน ดูปัญหาที่เกี่ยวข้องที่นี่github.com/cmderdev/cmder/issues/1666
edmundo096

17

หากคุณไม่จำเป็นต้องทำอะไรในไฟล์แบทช์หลังจากที่แอปพลิเคชันของคุณเสร็จสิ้นตามปกติแล้วการใช้startคำสั่งจะช่วยให้มั่นใจได้ว่าไฟล์แบตช์เสร็จสมบูรณ์แล้วตามเวลาที่คุณกด Ctrl-C และด้วยเหตุนี้ข้อความจะไม่ปรากฏ

ตัวอย่างเช่น:

@ ปิดเสียง

ตั้งค่า my_command = ping.exe
ตั้ง my_params = -t www.google.com

คำสั่ง echo ที่จะดำเนินการโดย 'เริ่มต้น':% my_command%% my_params%

:: เมื่อไม่ได้ใช้ / B หรือ / WAIT สิ่งนี้จะสร้างหน้าต่างใหม่ในขณะที่
:: การดำเนินการของไฟล์ชุดนี้จะดำเนินการต่อในหน้าต่างปัจจุบัน:

เริ่ม% my_command%% my_params%

เสียงสะท้อน
echo บรรทัดนี้จะถูกเรียกใช้งานก่อนที่ 'เริ่มต้น' จะเสร็จสิ้น ดังนั้นสิ่งนี้
ไฟล์แบตช์ echo จะเสร็จสมบูรณ์ก่อนกดปุ่ม Ctrl-C ในหน้าต่างอื่น
เสียงสะท้อน

:: เพียงแค่สำหรับการทดสอบใช้ 'หยุดชั่วคราว' เพื่อแสดง "กดปุ่มใด ๆ เพื่อดำเนินการต่อ" เพื่อดู
:: การส่งออกของคำสั่ง 'echo' อย่าลืมกด Ctrl-C ในหน้าต่าง
:: ที่รันคำสั่ง 'ping' (ไม่ใช่ในหน้าต่างนี้มาก) หรือเพียงแค่ลบ
:: บรรทัดถัดไปเมื่อสับสน:

หยุด

(ทดสอบบน Windows XP)


ฉันไม่รู้ว่าstartจะช่วยได้จริงหรือเปล่าแต่ฟังดูน่าเชื่อถือสำหรับฉัน ดังนั้นฉันสงสัยว่า downvote หมายความว่าสิ่งนี้จะไม่ทำงานหรือไม่ หรือใครก็ตามที่ downvoted ไม่ทราบคำสั่งWindows start(หรือโดยเฉพาะstart /waitและstart /b)? ดูmicrosoft.com/resources/documentation/windows/xp/all/proddocs/…จากนั้น กรุณาอธิบาย downvote?
Arjan

startจะไม่ทำงาน เมื่อใดก็ตามที่ cmd กำลังเรียกใช้ไฟล์แบตช์การแตะ Ctrl + C จะทำให้กระบวนการที่กำลังทำงานอยู่ในปัจจุบันยุติและแสดงคำถาม
Joey

1
+1 ใช้ได้สำหรับฉัน อย่างไรก็ตาม / b จะปิดการจัดการ Ctrl + C (ซึ่งน่ารำคาญ)
Nick Bolton

3
ไม่เป็นไรถ้าคุณดับเบิลคลิกที่ไฟล์แบตช์ แต่ถ้าคุณเริ่มแบตช์ไฟล์ในคอนโซล
Helgi

8
(การพูดจาก Windows 7 ไม่แน่ใจว่าใช้ได้กับ XP) นักพัฒนาที่ไม่ได้คิดจ้างโดยMicrosoftเพื่อเขียนโค้ดstartคำสั่งทำให้การตัดสินใจโง่ ๆ เพื่อให้ชื่อเรื่องของหน้าต่างทั้งบังคับและไม่บังคับในเวลาเดียวกัน - ในทางที่ค่อนข้างสับสน ดังนั้นถ้าเคยคุณ%my_command%ถูกล้อมรอบในราคาคู่มันจะกลายเป็นชื่อของหน้าต่างและพระรามเป็นครั้งแรกใน%my_params%กลายเป็นคำสั่ง start "some title here" %my_command% %my_params%เพื่อความปลอดภัยใช้ ส่วนใหญ่ใช้""และสาปแช่งผู้พัฒนาโดยไม่ใช้/TITLEหรือ/Tตัวเลือกแทนการตั้งชื่อ
ADTC

13

ฉันได้ต่อสู้ด้วยความปรารถนาที่จะหลีกเลี่ยงพรอมต์ "ยุติแบทช์งาน" สักครู่

Epiphany ล่าสุดของฉันเป็นบิตของมืออันว่องไว (หรือหน้าต่างคอนโซล) โดยการแทนที่อินสแตนซ์หนึ่งของcmd.exeด้วยอันอื่น สิ่งนี้สามารถทำได้โดยการรันคำสั่ง / โปรแกรมผ่านstart cmd /kตามด้วยโดยทันทีexitใน.BATไฟล์

หน้าต่างคอนโซลเดิมจะหายไปและเปลี่ยนหนึ่งสามารถหยุดได้อย่างหมดจดผ่าน-CtrlC

พิจารณาตัวอย่างต่อไปนี้ของ a tracerouteที่สามารถถูกขัดจังหวะด้วยCtrl+ Cหรืออนุญาตให้เสร็จสมบูรณ์โดยส่งคืนผู้ใช้ไปที่C:\>พรอมต์:

@echo off

set timeout=100
if not "%2"=="" set timeout=%2

start cmd /k tracert -w %timeout% %1
exit

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


+1 วิธีการที่แปลกใหม่มากและถึงแม้ว่าฉันจะเห็นด้วยไม่ใช่การเปลี่ยนที่ถูกต้อง แต่ก็ใช้งานได้ดี (แม้ว่าคุณจะไม่ต้องกังวลกับฉันเมื่อคุณเริ่มโพสต์ด้วย "replace cmd.exe" - สัญญาณเตือนความปลอดภัยก็ดังขึ้น สิ่งที่คุณหมายถึง)
พื้นฐาน

คุณควรใช้exit /bเพื่อออกจากสคริปต์ชุด
Sebastian Godelet

1
@SebastianGodelet: นั่นเป็นคำแนะนำที่ดีโดยทั่วไป แต่นี่คือความตั้งใจที่จะปิดหน้าต่างคอนโซล (ดั้งเดิม) แน่นอนเนื่องจากคำสั่งเป้าหมายเปิดตัวในหน้าต่างใหม่
mklement0

เหตุใดจึงใช้ "cmd / k" (เปิดล่ามไว้) แทนที่จะเป็น "/ c" เพียงเพื่อให้สามารถเห็นผลลัพธ์ของคำสั่ง?
Raúl Salinas-Monteagudo

9

วิธีการแก้ปัญหา Gringo เป็นสิ่งที่ดี แต่ไม่ได้ทำงานได้ดีกับสคริปที่ผ่านพร้อมรายการอาร์กิวเมนต์ (คือpython myscript.py %*) เนื่องจากไม่ได้ปรับปรุงSHIFT %*มีวิธีแก้ไขเฉพาะหน้าแต่มีข้อ จำกัด บางประการ

นี่คือการดัดแปลงที่ฉันได้รับ:

IF [%JUSTTERMINATE%] == [OKAY] (
    SET JUSTTERMINATE=
    python myscript.py %*
) ELSE (
    SET JUSTTERMINATE=OKAY
    CALL %0 %* <NUL
)

99. (9)% ไร้ที่ติ


สิ่งนี้จะไม่ทำงานหากmyscript.pyต้องการอ่านจาก stdin
jamesdlin


0

ในกรณีของฉันมันเป็นไฟล์ ping.bat ที่ถูกต้องในไดเรกทอรีผู้ใช้ของฉัน (C: \ Users \ ใน Vista หรือ C: \ Documents และ Settings \ in XP) ที่ถืองานแบตช์โดยไม่กำหนดเวลา

ไฟล์แบทช์นี้ถูกเรียกใช้งานเมื่อใดก็ตามที่ฉันรัน ping จากพรอมต์คำสั่งโดยที่ไดเรกทอรีปัจจุบันคือไดเรกทอรีผู้ใช้ของฉัน Ping-ing จากหน้าต่าง Run หรือจากไดเรกทอรีของผู้ใช้รายอื่นทำงานได้ดี

ลบไฟล์ออกจากผู้ใช้ของฉันและปัญหาได้รับการแก้ไข!


0

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


0

เพียงแค่เปลี่ยนแบตช์ stdin เป็นโมฆะโดยการเพิ่ม <nul ไปยังจุดสิ้นสุดของคำสั่ง


2
ฉันคิดว่าคุณอาจหมายถึง <nul (ในฐานะ> nul ส่ง stdout ทั้งหมดเป็นโมฆะ)
Brian Phillips

0

ฉันวิ่งเข้าไปหาสิ่งนี้ด้วย EXE ที่ดูเหมือนจะขว้าง ^ C ไปยังแบทช์หลักเมื่อออกทำให้เกิดข้อความแจ้งให้ "เลิกใช้งานแบทช์" แม้กระทั่งในทางออกที่สะอาด

วิธีแก้ปัญหาที่ฉันเลือกใช้คือรันแบตช์ด้วย "เริ่มต้น" คล้ายกับคำตอบอื่น ๆ แต่จากพรอมต์ PowerShell (หรือผ่านวิธีล่าม PowerShell จาก CMD หากคุณเลือก)

ตอนนี้เป็นปี 2018 และใน Windows 10 Microsoft เริ่มแทนที่ CMD ด้วย PowerShell เป็นพรอมต์คำสั่งที่ต้องการดังนั้นจึงพร้อมใช้งานใน GUI ตามค่าเริ่มต้น

Startเป็นนามแฝงสำหรับการเริ่มต้นกระบวนการ

เมื่อเรียกใช้จะเปิดและส่งคืน ดังนั้นเมื่อคุณหยุดกระบวนการที่เปิดตัวจะไม่มีพรอมต์ "ยุติงานแบทช์"

โดยค่าเริ่มต้นจะไม่รอดังนั้นจึงไม่มีข้อโต้แย้งเพิ่มเติมนอกเหนือจากคำสั่งและต้องมีอาร์กิวเมนต์

ใช้start mything.exe -mythings -argumentsในชุดของฉันทำงานอย่างสมบูรณ์

ในสคริปต์ PowerShell .\host.batต้องนำหน้าด้วยเส้นทางของพวกเขาที่จะเปิดตัวดังนั้นฉันเรียกใช้ไฟล์ชุดของฉันเป็น


0

TCC / LEซึ่งเป็นการเปลี่ยน CMD ฟรี (คิดว่าเป็น CMD ++) มีตัวเลือกในการระงับพรอมต์งานแบ็ตช์ คุณสามารถค้นหาตัวเลือกในกล่องโต้ตอบการกำหนดค่าเริ่มต้นของ TCC :

ยกเลิกไฟล์แบทช์บน Ctrl-C : ยกเลิกการประมวลผลไฟล์แบตช์โดยไม่แจ้งให้ทราบตามปกติเมื่อคุณกด Control-C

ภาพหน้าจอ:

ตัวเลือก TCC / LE

หากคุณไม่เคยได้ยินเกี่ยวกับ TCC / LE มาก่อนนี่เป็นคำพูดสั้น ๆ จากเว็บไซต์:

TCC / LE เป็นการแทนที่สำหรับบรรทัดคำสั่ง CMD (พรอมต์คำสั่ง Windows เริ่มต้น) TCC / LE เป็นชุดของ CMD ที่มีคำสั่งภายใน 111 คำสั่ง (CMD มีน้อยกว่า 40), 240 ตัวแปรและฟังก์ชั่นภายในและการปรับปรุงหลายร้อยคำสั่ง CMD ที่มีอยู่

TCC / LE ทำงานร่วมกับแอปพลิเคชันบรรทัดคำสั่งและแบตช์ไฟล์ที่มีอยู่ของคุณ แต่มีการปรับปรุงที่สำคัญในความสามารถบรรทัดคำสั่งและไฟล์แบตช์และเพิ่มคุณสมบัติใหม่หลายพันรายการในหน้าต่างพรอมต์คำสั่งของคุณ

ฉันใช้ TCC / LE เป็นเวลาหลายปีและ 4NT ก่อนหน้านี้ ฉันมีความรักมากมายและสามารถแนะนำได้ เหตุผลเดียวที่ฉันยังไม่ได้ใช้เพราะฉันใช้ PowerShell เป็นพิเศษตอนนี้


0

เหตุผลสำคัญในการระงับ "ยุติแบทช์งาน (Y / N)" คือการเรียกใช้โปรแกรมในลูป (เช่น: เรียกใช้อีกครั้งในกรณีที่เกิดปัญหา)

https://stackoverflow.com/a/8185270/1170023นี้ช่วยในการแก้ปัญหานี้:

@ECHO OFF
rem assumes you have installed pslist from sysinternals to windows PATH

:RUN
echo Starting GoldenEye Dedicated Server
start "" srcds.exe -console -game gesource +maxplayers 16 +map ge_complex

:LOOP
pslist srcds >nul 2>&1
if ERRORLEVEL 1 (
  goto RUN
) else (
  rem echo Dedicated server is still running
  timeout /t 5 >nul
  goto LOOP
)

-2

วิธีที่ง่ายที่สุดในการระงับการยืนยันถ้าคุณใช้เทอร์มินัลHyperคือการเพิ่มปลั๊กอินไฮเปอร์ใช่


ทำไมต้องลงคะแนน ฉันแสดงว่าเมื่อใช้ Hyper เท่านั้น จริง ๆ แล้วมันเป็นทางออกที่ดีที่ฉันใช้เมื่อใช้ windows
Ricky Boyce

1
คำถามเกี่ยวกับ cmd.exe
Raúl Salinas-Monteagudo

-3

ในตอนท้ายของสคริปต์ของคุณเพียงแค่เพิ่มคำสั่งต่อไปนี้:
echo
สิ่งนี้จะไม่ "ทำลาย" ลักษณะการทำงานของสคริปต์ของคุณและดูเหมือนว่าจะป้องกัน CDM เพื่อถามว่าคุณต้องการยกเลิกแบตช์หรือไม่


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