Làm thế nào để thay thế xác nhận công việc hàng loạt (Y / N)?


153

Trong cmd, khi chúng tôi nhấn Ctrl + C, chúng tôi sẽ chấm dứt ứng dụng đích nhưng nếu ứng dụng đích được gọi từ tệp bó, chúng tôi sẽ nhận được xác nhận "Chấm dứt công việc hàng loạt (Y / N)" này. Tôi không bao giờ có thể nhớ một trường hợp mà tôi đã chọn không chấm dứt công việc hàng loạt. Làm thế nào chúng ta có thể bỏ qua xác nhận này?


Bạn đã bao giờ thử câu trả lời của sgmoore chưa? superuser.com/questions / 35168 / từ
Arjan

10
"Tôi không bao giờ có thể nhớ một trường hợp mà tôi đã chọn không chấm dứt công việc hàng loạt." Và thực tế, trong hầu hết các trường hợp, công việc bị chấm dứt ngay cả khi bạn trả lời Không ...
PhiLho

@PhiLho - Điều đó không thể đúng, vì các tập lệnh của tôi luôn tiếp tục sau khi tôi nhập N. Tôi tò mò kịch bản nào bạn có khi tập lệnh bó chấm dứt sau khi bạn nhập N.
dbenham

Tôi đã hy vọng điều này sẽ dễ dàng, nhưng như thường lệ, Microsoft đã làm cho một cái gì đó đơn giản trở thành một nỗi đau ở mông. Các câu trả lời dưới đây đều là quá nhiều nỗ lực để tránh sự phiền toái nhỏ này. Tôi chỉ thấy khó chịu vì không có cách nào đơn giản để giải quyết chuyện này. Nghiêm túc Microsoft, điểm của lời nhắc này là gì? Có, tôi chắc chắn, đó là lý do tại sao tôi nhấn Ctrl + C ...
Chev

Vấn đề này ít nhất là khiến tôi nhớ và sử dụng công -ntắc cho ping cygwin thường xuyên hơn.
palswim

Câu trả lời:


53

AFAIK bạn không thể vì hành vi này là do thiết kế và được điều khiển bởi trình thông dịch lệnh. Không có phương pháp "ánh xạ" hoặc thậm chí "chặn" điều này trừ khi bạn biên dịch lại và biên dịch lại trực tiếp trình thông dịch.


39
Điều đó thật đáng thất vọng :(
Srikanth

Vâng, thật đáng thất vọng. Điều đáng thất vọng hơn nữa là lệnh BREAK, theo mặc định không có gì trong XP, có thể đã được sử dụng để chuyển đổi dấu nhắc nhắc
Synetech

3
Mặc dù có thể đúng nhưng người ta không thể làm cho trình thông dịch cư xử khác đi, sử dụng startnhư sgmoore được đề xuất tại superuser.com/questions353698/NH dường như là một cách giải quyết hoàn toàn tốt đối với tôi.
Arjan


57

Nhấn Ctrl+ Chai lần.


5
Điều này sẽ không hoạt động mà là lặp lại nhắc nhở.
Joey

8
Tôi chỉ giết cơ sở dữ liệu của tôi bằng cách làm điều đó! Tập lệnh đang chờ "tạm dừng", vì vậy tôi đã thực hiện CTRL-C, và sau đó lời nhắc đến, vì vậy tôi đã thực hiện lại CTRL-C và sau đó tệp bó hapilly tiếp tục và xóa cơ sở dữ liệu của tôi! @see superuser.com/questions/740004/ Mạnh
Sebastien Diot

2
Đó không phải là những gì OP yêu cầu. Anh ta có thể dễ dàng gõ "N" sau ^ C.
vladr

3
@vladr nó dễ dàng hơn để giữ Ctrlvà chạm Cmột lần nữa so với đánh Ysau đó Enter.
Nick T

20
@SebastienDiot Bạn đã thử một kỹ thuật mới trên một tập lệnh có khả năng hủy dữ liệu vĩnh viễn? Đó là ... Dũng cảm.
Cơ bản

57

Tại trang web này , tôi tìm thấy một giải pháp hiệu quả:

script2.cmd < nul

Để không phải gõ nó ra mỗi lần tôi tạo một tập lệnh thứ hai được gọi script.cmdtrong cùng thư mục với dòng trên. Tôi đã thử nghiệm kỹ thuật này chỉ trên XP, nhưng những người khác đã xác nhận nó trên Win 7.

Nathan cho biết thêm: một tùy chọn khác là đặt đoạn mã sau ở đầu script.cmd, thao tác tương tự trong một tệp:

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
Nếu bạn gọi một tệp bó từ bên trong chính nó (mà không sử dụng lệnh CALL), thì việc thực thi sẽ được chuyển "vĩnh viễn". Nếu STDIN được chuyển hướng đến NUL, mọi dấu nhắc "Chấm dứt hàng loạt công việc" sẽ vẫn xuất hiện, nhưng sẽ không chờ đợi (vì STDIN không còn nữa) cho đầu vào. Điều này làm việc cho tôi ...
William

3
Điều này hoạt động trong Windows 7.
William

17
Nó hoạt động, trừ khi bạn cần đầu vào của người dùng trong lô.
Augusto Men

2
@William, Chỉ cần gọi kịch bản là không hiệu quả với tôi, nhưng tôi đã đưa ra một cách giải quyết : @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Gọi chính nó đệ quy, nhưng với một đối số lần thứ hai. Nếu tập lệnh của bạn có đối số, bạn có khả năng có thể sử dụng đối số vị trí không sử dụng đầu tiên. Điều đó có thể có vấn đề nếu kịch bản của bạn có nhiều đối số. Kịch bản của tôi không cần đối số hoặc đầu vào của người dùng.
jpmc26

câu trả lời của jpmc làm việc cho tôi. Nó có lặp lại tiếng vang chấm dứt (y / n) không? tin nhắn sau đó kết thúc, nhưng không dừng lại cho nó.
ggb667

28

Cài đặt Clink và thay đổi cài đặt "terminating_autoanswer". Các tập tin cài đặt nên ở đây : 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

Điều này sau đó "chỉ hoạt động" với bất kỳ cửa sổ cmd.exe. Bạn không cần phải thay đổi những gì đang chạy hoặc nếu không, vì vuốt ngược lại trên cmd.exe.

Frickin 'tuyệt vời, IMO!


Clink là tuyệt vời nhưng điều này không làm việc cho tôi, sử dụng cmd.exe hoặc Console2. Nó vẫn hỏi và nó không được tự động điền.
iono

@tometoftom: Bạn đã thay đổi tập tin cài đặt như trên? Tôi đã phải làm điều đó để làm cho nó hoạt động. (Lưu ý rằng bạn phải là quản trị viên để lưu tệp chính xác trên Windows Vista trở lên ...)
Macke

3
Ah, vẫn không có xúc xắc. Microsoft thở dài , vì Chúa ...
iono

3
@iono bạn có phiên bản Windows không phải tiếng Anh không? Trong trường hợp này, clink không thể tự động trả lời lời nhắc cho đến khi phiên bản 0.4.3 vài ngày trước: github.com/mridgers/clink/release/tag/0.4.3
schlamar

3
Liên quan: đối với những người sử dụng cmder , cài đặt được bật \cmder\config\settings. Xem các vấn đề liên quan ở đây github.com/cmderdev/cmder/issues/1666
edmundo096

17

Nếu bạn không cần phải làm bất cứ điều gì trong tệp bó sau khi ứng dụng của bạn kết thúc bình thường, thì sử dụng startlệnh đảm bảo rằng tệp bó đã hoàn thành trước thời điểm bạn nhấn Ctrl-C. Và do đó tin nhắn sẽ không xuất hiện.

Ví dụ:

@echo tắt

đặt my_command = ping.exe
đặt my_params = -t www.google.com

echo Lệnh được thực thi bởi 'start':% my_command %% my_params%

:: Khi KHÔNG sử dụng / B hoặc / WAIT thì điều này sẽ tạo ra một cửa sổ mới, trong khi
:: thực thi tệp rất bó này sẽ tiếp tục trong cửa sổ hiện tại:

bắt đầu% my_command %% my_params%

tiếng vang.
echo Dòng này sẽ được thực hiện TRƯỚC 'bắt đầu' thậm chí kết thúc. Vì vậy, cái này
tập tin echo echo sẽ hoàn thành TRƯỚC KHI nhấn Ctrl-C trong cửa sổ khác.
tiếng vang.

:: Chỉ để kiểm tra, sử dụng 'tạm dừng' để hiển thị "Nhấn phím bất kỳ để tiếp tục", để xem
:: đầu ra của các lệnh 'echo'. Hãy chắc chắn nhấn Ctrl-C trong cửa sổ
:: chạy lệnh 'ping' (không phải trong chính cửa sổ này). Hoặc đơn giản là loại bỏ
:: dòng tiếp theo khi nhầm lẫn:

tạm ngừng

(Đã thử nghiệm trên Windows XP.)


Tôi không biết nếu startthực sự sẽ giúp, nhưng nó có vẻ hợp lý với tôi. Vì vậy, tôi tự hỏi nếu downvote ngụ ý rằng điều này sẽ KHÔNG hoạt động? Hoặc có thể bất cứ ai bị hạ cấp không biết lệnh của Windows start(hoặc đặc biệt start /waitstart /b)? Xem microsoft.com/resource/documentation/windows/xp/all/proddocs/ Khăn sau đó. Hãy giải thích các downvote?
Arjan

startsẽ không làm việc Bất cứ khi nào cmd đang chạy một tệp bó, nhấn Ctrl + C sẽ khiến quá trình hiện đang chạy chấm dứt và hiển thị câu hỏi.
Joey

1
+1 hoạt động với tôi. Tuy nhiên, / b tắt xử lý Ctrl + C (gây khó chịu).
Nick Bolton

3
Điều này tốt nếu bạn nhấp đúp vào tệp bó. Nhưng nếu bạn bắt đầu tập tin bó trong bảng điều khiển thì sao?
Helgi

8
(Phát biểu từ Windows 7, không chắc chắn nếu áp dụng đối với XP) Các không suy nghĩ phát triển thuê bởi Microsoft để mã startlệnh đã quyết định ngu ngốc để làm cho tiêu đề của cửa sổ cả bắt buộc và không bắt buộc cùng một lúc - một cách khá khó hiểu. Vì vậy, nếu bao giờ bạn %my_command%được đặt trong dấu ngoặc kép, nó sẽ trở thành tiêu đề của cửa sổ và thông số đầu tiên %my_params%trở thành lệnh . Để an toàn, sử dụng start "some title here" %my_command% %my_params%. Hầu hết chỉ sử dụng ""và nguyền rủa nhà phát triển vì không sử dụng tùy chọn /TITLEhoặc /Tthay vào đó để đặt tiêu đề.
ADTC

13

Tôi đã chiến đấu với mong muốn này để tránh lời nhắc "Chấm dứt công việc hàng loạt" trong một thời gian ngắn.

Hiển linh mới nhất của tôi là một chút ánh sáng của bàn tay (hoặc cửa sổ giao diện điều khiển), bằng cách thay thế một ví dụ cmd.exebằng một phiên bản khác. Điều này được thực hiện bằng cách thực hiện lệnh / chương trình thông qua start cmd /kngay sau đó exittrong .BATtệp.

Cửa sổ bàn điều khiển ban đầu biến mất và cửa sổ thay thế có thể được dừng sạch sẽ thông qua Ctrl- C.

Hãy xem xét ví dụ sau về một traceroutecái có thể bị gián đoạn bởi Ctrl+ Choặc được phép hoàn thành, đưa người dùng trở lại C:\>dấu nhắc:

@echo off

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

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

Sự thay thế môi trường của một trình thông dịch lệnh mới có thể không dành cho tất cả mọi người, nhưng, bằng mắt thường, ngoại hình và hoạt động tốt đối với tôi.


+1 Một cách tiếp cận rất mới lạ và mặc dù tôi đồng ý rằng đây không phải là một sự thay thế chính xác, nhưng nó hoạt động tốt (mặc dù bạn đã lo lắng cho tôi khi bạn bắt đầu bài đăng của mình bằng "thay thế cmd.exe" - báo động bảo mật đã reo cho đến khi tôi lấy ví dụ và nhận ra ý bạn là gì)
Cơ bản

bạn nên sử dụng exit /bđể thoát khỏi tập lệnh bó
Sebastian Godelet

1
@SebastianGodelet: Đó là lời khuyên tốt nói chung, nhưng ở đây ý định thực sự là đóng cửa sổ giao diện điều khiển (ban đầu) , với điều kiện là lệnh đích được khởi chạy trong một cửa sổ mới .
mkuity0

Tại sao nên sử dụng "cmd / k" (giữ cho trình thông dịch mở) thay vì "/ c"? Chỉ để có thể thấy đầu ra của lệnh?
Raúl Salinas-Monteagudo

9

Giải pháp của Gringo là tốt, nhưng không hoạt động tốt với các tập lệnh đi qua danh sách đối số (nghĩa là python myscript.py %*), vì SHIFTkhông cập nhật %*. Có cách giải quyết , nhưng chúng có những hạn chế nhất định.

Đây là sửa đổi tôi đã kết thúc với:

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

99. (9)% hoàn hảo.


Điều này sẽ không hoạt động nếu myscript.pymuốn đọc từ stdin.
jamesdlin


0

Trong trường hợp của tôi, đó là tệp ping.bat nằm ngay trong thư mục người dùng của tôi (C: \ Users \ trong Vista hoặc C: \ Documents and Settings \ in XP) đang giữ công việc hàng loạt không xác định.

Tệp bó này được thực thi bất cứ khi nào tôi chạy ping từ dấu nhắc lệnh trong đó thư mục hiện tại là thư mục người dùng của tôi. Ping-ing từ cửa sổ Run hoặc từ thư mục người dùng khác đang chạy tốt.

Đã xóa tệp khỏi thư mục người dùng của tôi và vấn đề đã được giải quyết!


0

Bắt đầu hoạt động, nhưng bây giờ cửa sổ được mở bởi tệp bó được thay đổi từ các tùy chọn tôi có và "thuộc tính" bị vô hiệu hóa (sẽ không phản hồi).


0

Chỉ cần chuyển hướng lô stdin thành null bằng cách thêm <nul vào cuối lệnh.


2
Tôi nghĩ bạn có thể có nghĩa là <nul (vì> nul gửi tất cả các thiết bị xuất chuẩn thành null).
Brian Phillips

0

Tôi đã chạy vào đây với một EXE dường như ném ^ C vào lô cha mẹ khi thoát, gây ra dấu nhắc "Chấm dứt hàng loạt công việc" ngay cả trên một lối thoát sạch.

Giải pháp tôi chọn sử dụng là chạy lô với "Bắt đầu", tương tự như các câu trả lời khác, nhưng từ lời nhắc PowerShell (hoặc thông qua phương thức trình thông dịch PowerShell từ CMD, nếu bạn chọn).

Bây giờ là năm 2018 và trong Windows 10, Microsoft đã bắt đầu thay thế CMD bằng PowerShell như một dấu nhắc lệnh ưa thích, do đó, nó có sẵn trong GUI, theo mặc định.

Startlà một bí danh cho Quá trình bắt đầu .

Khi chạy, nó chỉ khởi chạy và trở về. Vì vậy, khi bạn dừng quá trình khởi chạy, không có dấu nhắc "Chấm dứt hàng loạt công việc".

Theo mặc định, nó không chờ, vì vậy không có đối số bổ sung ngoài lệnh và đối số của nó là bắt buộc.

Sử dụng start mything.exe -mythings -argumentstrong lô của tôi làm việc hoàn hảo.

Trong các kịch bản PowerShell phải được đi trước bởi đường dẫn của chúng sẽ được khởi chạy, vì vậy tôi chạy tệp bó của mình dưới dạng .\host.bat.


0

TCC / LE , là một thay thế CMD miễn phí (nghĩ về nó như là CMD ++), có một tùy chọn để chặn dấu nhắc công việc hàng loạt chấm dứt. Bạn có thể tìm thấy tùy chọn trong Hộp thoại Cấu hình Khởi động TCC :

Hủy tệp hàng loạt trên Ctrl-C : Hủy xử lý tệp hàng loạt mà không có lời nhắc thông thường khi bạn nhấn Control-C.

Ảnh chụp màn hình:

Tùy chọn TCC / LE

Nếu bạn chưa bao giờ nghe nói về TCC / LE trước đây, thì đây là một số lời giới thiệu từ trang web:

TCC / LE là sự thay thế cho dòng lệnh CMD (dấu nhắc lệnh mặc định của Windows). TCC / LE là một siêu bộ của CMD, với 111 lệnh bên trong (CMD có ít hơn 40), 240 biến và hàm bên trong và hàng trăm cải tiến cho các lệnh CMD hiện có.

TCC / LE hoạt động với các ứng dụng dòng lệnh và tệp bó hiện có của bạn, nhưng cung cấp các cải tiến lớn về khả năng tệp dòng lệnh và tệp bó và thêm hàng ngàn tính năng mới vào cửa sổ nhắc lệnh của bạn.

Tôi đã sử dụng TCC / LE trong nhiều năm và 4NT trước đó. Tôi đã có rất nhiều tình yêu cho nó và có thể giới thiệu nó. Lý do duy nhất tôi không sử dụng nó là vì tôi gần như chỉ sử dụng PowerShell.


0

Một lý do chính để ngăn chặn "Chấm dứt công việc hàng loạt (Y / N)", là để chạy một chương trình trong một vòng lặp (ví dụ: chạy lại trong trường hợp nó gặp sự cố).

Https://stackoverflow.com/a/8185270/1170023 này đã giúp dẫn đến giải pháp này:

@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

Cách dễ nhất để chặn xác nhận nếu bạn sử dụng thiết bị đầu cuối Hyper , là thêm plugin siêu có .


Tại sao các downvote? Tôi đã ký hiệu khi chỉ sử dụng Hyper. Nó thực sự là một giải pháp tuyệt vời tôi sử dụng khi sử dụng windows.
Ricky Boyce

1
Câu hỏi là về cmd.exe.
Raúl Salinas-Monteagudo

-3

Khi kết thúc tập lệnh của bạn, chỉ cần thêm lệnh sau:
echo
Điều này sẽ không "làm hỏng" hành vi của tập lệnh của bạn và dường như ngăn CDM hỏi bạn có muốn chấm dứt lô không.


5
Không làm việc cho tôi.
Helgi
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.