題 如何抑制“終止批處理作業(Y / N)”確認?


在cmd中,當我們按Ctrl + C時,我們終止目標應用程序,但如果從批處理文件中調用目標應用程序,我們將得到“終止批處理作業(Y / N)”確認。我永遠不會記得我選擇不終止批處理作業的實例。我們如何跳過此確認?


133
2017-09-04 12:39


起源


你有沒有試過sgmoore的答案? superuser.com/questions/35698/... - Arjan
“我永遠不會記得我選擇不終止批處理作業的實例。”實際上,在大多數情況下,即使您回答否,工作也會終止... - PhiLho
@PhiLho - 這不可能是真的,因為我的腳本在我進入後總是繼續 N。我很好奇您輸入後批處理腳本終止的情況 N。 - dbenham
我希望這很容易,但像往常一樣,微軟已經做了一些簡單的麻煩。下面的答案都是為了避免這種輕微煩惱而花費太多精力。我很生氣,沒有簡單的方法來解決這個問題。嚴重的微軟,這個提示有什麼意義?是的我確定,這就是我按Ctrl + C的原因...... - Chev
這個問題至少讓我記住並利用了 -n 切換到cygwin 平 更經常。 - palswim


答案:


AFAIK你不能,因為這種行為是由設計和命令解釋器控制的。除非您直接解編譯並重新編譯解釋器,否則沒有“映射”甚至“攔截”這種方法。


44
2017-09-04 12:42



這令人失望:( - Srikanth
是的,這是令人失望的。更令人失望的是BREAK命令,默認情況下在XP下什麼都不做,可以用來切換提示...... - Synetech
雖然可能是真的,但是使用時不能使解釋器的行為不同 start 像sgmoore建議的那樣 superuser.com/questions/35698/... 對我來說似乎是一個非常好的解決方法。 - Arjan
這裡是: superuser.com/a/498798/56101 - Totty.js


按Ctrl+C 兩次。


54
2017-09-04 18:28



這不起作用,而是重複提示。 - Joey
對我來說很完美,謝謝! - captainclam
我剛剛殺了我的數據庫!腳本正在等待“暫停”,所以我做了CTRL-C,然後提示來了,所以我再次執行了CTRL-C,然後批處理文件繼續執行,並刪除了我的數據庫! @看到 superuser.com/questions/740004/... - Sebastien Diot
@vladr它無限容易握住 Ctrl 並點按 C 再次打擊 Y 然後 Enter。 - Nick T
@SebastienDiot你在一個有可能永久破壞數據的腳本上嘗試了一種新技術?那是......勇敢。 - Basic


在這 現場,我找到了有效的解決方案:

script2.cmd < nul

每次我調用第二個腳本時都不必輸入 script.cmd 在與上面一行相同的文件夾中。我在XP上測試過這種技術,但其他人已經在Win 7上證實了這一點。

Nathan補充說:另一種選擇是將以下代碼放在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
)

42
2017-11-03 03:29



如果從內部調用批處理文件(不使用CALL命令),則“永久”傳輸執行。如果STDIN被重定向到NUL,任何“終止批處理作業”提示仍將出現,但不會等待(因為STDIN消失)輸入。這對我有用...... - William
這適用於Windows 7。 - William
它有效,除非您需要批量中的用戶輸入。 - Augusto Men
@William,只是調用腳本對我不起作用,但我想出了一個解決方法: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command])。遞歸調用自身,但第二次使用參數。如果您的腳本有參數,則可能使用第一個未使用的位置參數。如果你的腳本有很多參數,那可能會有問題。我的腳本不需要參數或用戶輸入。 - jpmc26
jpmc的回答對我有用。它確實回應了終止(y / n)?然後消息,但不會停止它。 - ggb667


安裝 碰杯 並更改“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窗口都“正常工作”。您不需要更改正在運行的內容或其他內容,因為clink背負著cmd.exe。

弗里金很棒,IMO!


22
2018-04-03 06:50



Clink很棒但是這對我來說不起作用,使用cmd.exe或Console2。它仍然要求並且它不會被自動填充。 - iono
@tometoftom:您是否按上述方式更改了設置文件?我必須這樣做才能讓它發揮作用。 (請注意,您必須是管理員才能在Windows Vista上正確保存文件...) - Macke
是的,隨著設置的改變。我是管理員:(我嘗試通過設置文件的快捷方式,為可執行文件執行“Run as Administror”,右鍵單擊 - >屬性,快捷方式選項卡,高級...然後“以管理員身份運行”是灰了。 - iono
啊,還是沒有骰子。 深深地嘆了口氣 微軟,為了上帝的緣故...... - iono
@iono你有非英文Windows版嗎?在這種情況下,clink無法自動回答提示,直到幾天前的0.4.3版本: github.com/mridgers/clink/releases/tag/0.4.3 - schlamar


如果您的應用程序正常完成後不需要在批處理文件中執行任何操作,那麼使用 start 命令確保在按Ctrl-C時批處理文件已完成。因此消息不會出現。

例如:

@echo關閉

設置my_command = ping.exe
設置my_params = -t www.google.com

echo命令由'start'執行:%my_command %% my_params%

::當不使用/ B或/ WAIT時,這將創建一個新窗口,而
::這個非常批處理文件的執行將在當前窗口中繼續:

啟動%my_command %% my_params%

迴聲。
echo此行將在“開始”之前執行。所以這
回顯批處理文件將在其他窗口中按Ctrl-C之前完成。
迴聲。

::只是為了測試使用'暫停'來顯示“按任意鍵繼續”,看看
::'echo'命令的輸出。務必在窗口中按Ctrl-C
::運行'ping'命令(不在此窗口中)。或者直接刪除
::混淆時的下一行:

暫停

(在Windows XP上測試過。)


16
2017-09-04 13:33



我不知道是否 start 確實會有所幫助,但這對我來說似乎有道理。所以我想知道downvote是否意味著這不起作用?或者也許那些投票不了解Windows的人 start (或特別是 start /wait 和 start /b)命令?看到 microsoft.com/resources/documentation/windows/xp/all/proddocs/... 然後。請解釋一下downvote? - Arjan
start 不行。每當cmd運行批處理文件時,點擊Ctrl + C將導致當前正在運行的進程終止並顯示問題。 - Joey
+1對我有用。但是,/ b關閉Ctrl + C處理(這很煩人)。 - Nick Bolton
如果您雙擊批處理文件,這很好。但是如果你在控制台中啟動批處理文件怎麼辦? - Helgi
(從Windows 7說起,不確定是否適用於XP) 沒頭沒腦 開發人員聘請 微軟 編碼 start 命令做出了愚蠢的決定 標題 窗口的強制性和可選性同時 - 以相當混亂的方式。所以,如果你的 %my_command% 用雙引號括起來,就成了 標題 窗口和第一個參數 %my_params% 變成了 命令。為了安全起見,請使用 start "some title here" %my_command% %my_params%。大多數只是使用 "" 並詛咒開發人員不使用 /TITLE 要么 /T 而是選擇設置標題。 - ADTC


我一直在努力避免“終止批處理作業”提示一段時間。

通過替換一個實例,我最近的頓悟是一個簡單的手(或控制台窗口) cmd.exe 和另外一個。這是通過執行命令/程序來完成的 start cmd /k 緊隨其後 exit 在裡面 .BAT 文件。

原始控制台窗口消失,可以通過乾淨地停止更換的控制台窗口 按Ctrl - C

考慮以下a的例子 traceroute 那可以被打斷 按Ctrl+C,或允許完成,將用戶返回到 C:\> 提示:

@echo off

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

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

新命令解釋器的環境替換可能不適合每個人,但是,肉眼看來,它看起來和我的工作都很好。


13
2018-05-16 17:05



+1一個非常新穎的方法,雖然我同意這不是一個確切的替代品,它運作良好(雖然當你用“替換cmd.exe”開始你的帖子時你確實擔心我 - 安全警報響了,直到我得到了這個例子並實現了你的意思是) - Basic
你應該使用 exit /b 退出批處理腳本 - Sebastian Godelet
@SebastianGodelet:這是一般的好建議,但這裡的意圖確實是關閉(原始)控制台 窗口鑑於目標命令是在a中啟動的 新 窗口。 - mklement0


Gringo的解決方案很好,但是對於通過參數列表傳遞的腳本不能很好地工作(即 python myscript.py %*),因為 SHIFT 沒有更新 %*。有 解決方法,但它們有一定的局限性。

這是我最終的修改:

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

99.(9)%完美無瑕。


7
2018-02-12 11:33



如果這不起作用 myscript.py 想從stdin讀取。 - jamesdlin