如何取消“终止批处理作业(是/否)”确认?


153

在cmd中,当我们按Ctrl + C组合键时,将终止目标应用程序,但是如果从批处理文件中调用了目标应用程序,则会得到此“终止批处理作业(Y / N)”的确认。我永远不会记得我选择不终止批处理作业的情况。我们如何跳过此确认?


您是否尝试过sgmoore的答案?superuser.com/questions/35698/…–
Arjan

10
“我永远不记得选择不终止批处理作业的情况。” 而实际上,在大多数情况下,作业即使回答否...终止
PhiLho

@PhiLho-不可能如此,因为输入后我的脚本始终会继续N。我很好奇在输入后批处理脚本终止的情况是什么N
dbenham

我原本希望这很容易,但是像往常一样,微软使简单的事情变得很痛苦。下面的答案都是花费太多的精力来避免这种小麻烦。我很生气,没有简单的方法可以解决这个问题。说真的,微软,这个提示的意义是什么?是的,我敢肯定,这就是为什么我按下Ctrl + C ...
Chev 2015年

这个问题至少使我想起并更频繁地使用-n开关进行cygwin ping
palswim 2015年

Answers:


53

AFAIK您不能这样做,因为此行为是设计使然并由命令解释器控制的。除非您直接反编译并重新编译解释器,否则没有“映射”甚至“拦截”该方法的方法。


39
令人失望的是:(
Srikanth

是的,这令人失望。更令人失望的是,BREAK命令(默认情况下在XP下不执行任何操作)可能已用于切换提示…
Synetech

3
虽然这可能是真的谁也不能把解释行为不同,使用start在像sgmoore建议superuser.com/questions/35698/...似乎是一个完全正常的解决方法给我。
Arjan 2010年


57

Ctrl+ C两次。


5
这将不起作用,而是重复提示。
乔伊(Joey)

8
我只是这样做杀死了我的数据库!该脚本正在等待“暂停”,所以我执行了CTRL-C,然后出现了提示,因此再次执行了CTRL-C,然后继续运行批处理文件,并删除了我的数据库!@see superuser.com/questions/740004/...
塞巴斯蒂安Diot

2
那不是OP问的。他可以很容易地在^ C之后键入“ N”。
vladr

3
@vladr是无限更容易保持Ctrl和挖掘C与击球再次Y然后Enter
尼克T

20
@SebastienDiot您在脚本上尝试了一种可能永久破坏数据的新技术吗?那是...勇敢。
2016年

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消失了)。这对我
威廉

3
这可在Windows 7
William

17
除非您在批处理中需要用户输入,否则它会起作用。
Augusto Men

2
@William,仅调用脚本对我不起作用,但我想出了一种解决方法:@IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command])。递归调用自身,但第二次带有参数。如果您的脚本具有参数,则可能使用第一个未使用的位置参数。如果您的脚本有很多参数,那可能会有问题。我的脚本不需要参数或用户输入。
jpmc26 2013年

jpmc的答案对我有用。它会回荡织补终止(y / n)吗?消息虽然结束了,但并没有停止。
ggb667 2014年

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窗口都“有效”。您无需更改正在运行的内容,因为可以在cmd.exe上进行附加链接。

弗里金真棒,海事组织!


Clink很棒,但是使用cmd.exe或Console2对我来说不起作用。它仍然会询问,并且不会自动填充。
iono

@tometoftom:您是否如上所述更改了设置文件?我必须这样做才能使其正常工作。(请注意,您必须是管理员才能在Windows Vista及更高版本上正确保存文件...)
Macke

3
啊,仍然没有骰子。微软深深感叹,看在上帝的份上……
iono

3
@iono您是否拥有非英语Windows版本?在这种情况下,直到几天前0.4.3发布,clink才能自动回答提示:github.com/mridgers/clink/releases/tag/0.4.3
schlamar 2015年

3
相关:对于使用cmder的用户,此设置为on \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这行将在“开始”完成之前执行。所以这
在另一个窗口中按Ctrl-C之前,echo批处理文件将完成。
回声。

::仅用于测试,请使用“暂停”显示“按任意键继续”,以查看
::'echo'命令的输出。确保在窗口中按Ctrl-C
::运行“ ping”命令(不在此窗口中)。或者只是删除
::混淆时的下一行:

暂停

(在Windows XP上测试。)


我不知道是否start真的有帮助,但这对我来说似乎很合理。因此,我想知道投票是否暗示这行不通吗?或者,也许谁被否决不知道Windows的命令start(尤其是start /waitand start /b)?然后,请参阅microsoft.com/resources/documentation/windows/xp/all/proddocs/…。请解释下票?
Arjan

start将无法正常工作。每当cmd运行批处理文件时,点击Ctrl + C都会导致当前正在运行的进程终止并显示问题。
乔伊,

1
+1对我有用。但是,/ b关闭Ctrl + C处理(很烦人)。
尼克·博尔顿

3
如果您双击批处理文件,这很好。但是,如果您在控制台中启动批处理文件怎么办?
Helgi 2012年

8
(从Windows 7来说,不确定是否适用于XP)Microsoft聘请了一位没有思想的开发人员来编写命令代码,这愚蠢的决定使窗口的标题同时成为强制性和可选性-相当混乱。因此,如果将您用双引号括起来,它将成为窗口的标题,而其中的第一个参数将成为command。为了安全起见,请使用。大多数人只是使用并诅咒开发人员,因为他们没有使用或选项来设置标题。start%my_command%%my_params%start "some title here" %my_command% %my_params%""/TITLE/T
ADTC 2015年

13

我一直在为避免“终止批处理作业”提示而奋斗一会儿。

我最近的顿悟是,通过将一个实例替换为另一个实例,有些花招cmd.exe。这是start cmd /k通过exit在以下位置紧接着在.BAT文件中执行命令/程序来完成的。

原来的控制台窗口消失了,可以通过Ctrl- 彻底停止替换的控制台窗口C

考虑以下示例,该示例traceroute可以被Ctrl+ 中断C或允许其完成,从而使用户返回C:\>提示:

@echo off

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

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

新命令解释器的环境替代可能并不适合每个人,但肉眼看来对我来说很好用。


+1一种非常新颖的方法,尽管我同意ti并不能完全替代它,但是它很好用(尽管当您使用“替换cmd.exe”开始发布时确实让我担心—安全警报一直响起,直到我了解示例为止您的意思)
基本的

您应该使用exit /b退出批处理脚本
Sebastian Godelet

1
@SebastianGodelet:通常,这是一个很好的建议,但是这里的目的确实是要关闭(原始)控制台窗口,因为目标命令是在窗口中启动的。
mklement0

为什么使用“ cmd / k”(保持解释器处于打开状态)而不是“ / c”?只是为了能够看到命令的输出?
劳尔·萨利纳斯-蒙塔古多

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

在我的情况下,正是我的用户目录(在Vista中为C:\ Users \或在XP中为C:\ Documents and Settings \)中的ping.bat文件不确定地保存了批处理作业。

每当我从命令提示符运行ping时,都会执行此批处理文件,当前目录是我的用户目录。从“运行”窗口或其他用户目录执行的ping操作正常。

从我的用户目录中删除了文件,问题已解决!


0

开始工作,但现在批处理文件打开的窗口已从我的选项中更改,并且“属性”被禁用(不会响应)。



0

我遇到了一个EXE,它似乎在退出时将^ C扔给了父批处理,甚至在干净的退出时也会引起“终止批处理作业”提示。

我选择使用的解决方案是使用“开始”运行批处理,与其他答案类似,但是从PowerShell提示符下(或通过CMD的PowerShell解释器方法(如果选择))。

现在是2018年,在Windows 10中,Microsoft已开始使用PowerShell作为首选命令提示符来取代CMD,因此默认情况下它可以在GUI中轻松使用。

StartStart-Process的别名。

运行时,它将启动并返回。因此,当您停止启动的过程时,没有“终止批处理作业”提示。

默认情况下,它不等待,因此除了命令及其参数之外,不需要其他参数。

start mything.exe -mythings -arguments在我的批次中使用效果很好。

在PowerShell中,脚本必须在其路径之前启动,因此我将运行批处理文件为.\host.bat


0

TCC / LE是CMD的免费替代品(认为它是CMD ++),具有禁止终止批处理作业提示的选项。您可以在“ TCC启动配置”对话框中找到该选项:

在Ctrl-C上取消批处理文件:按Ctrl-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
)


-3

在脚本的末尾,只需添加以下命令:
echo
这不会“损坏”脚本的行为,并且似乎阻止CDM询问是否要终止该批处理。


5
没为我工作。
Helgi 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.