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

评论

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

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

@PhiLho-不可能如此,因为输入N后我的脚本始终会继续。我很好奇您遇到哪种情况,输入N后批处理脚本会终止。

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

此问题至少使我记住并更频繁地使用-n开关进行cygwin ping。

#1 楼

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

评论


太令人失望了:(

– Srikanth
09年9月4日在12:42

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

– Synetech
09年12月24日在19:12

尽管可能确实不能使解释器表现出不同,但使用superuser.com/questions/35698/建议的sgmoore这样的启动对我来说似乎是一种完美的解决方法。

– Arjan
2010年1月6日在16:44

它在这里:superuser.com/a/498798/56101

– Totty.js
2014年7月8日在19:19

#2 楼

在此站点上,我找到了一个有效的解决方案:

script2.cmd < nul


不必每次在与该行相同的文件夹中创建另一个名为script.cmd的脚本时都键入此内容以上。我仅在XP上测试了该技术,但其他人已在Win 7上对其进行了确认。在一个文件中:

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
)


评论


如果从内部调用批处理文件(不使用CALL命令),则执行将“永久”转移。如果将STDIN重定向到NUL,则仍然会出现任何“终止批处理作业”提示,但不会等待(因为STDIN消失了)进行输入。这对我有用...

–威廉
13年2月22日在7:54

在Windows 7中有效。

–威廉
13年2月22日在7:54

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

–augustomen
13年3月27日在14:51

@William,仅调用脚本对我不起作用,但是我想出了一种解决方法:@IF“” ==“%1”(@%0 CALLED
– jpmc26
13年7月19日在23:58



jpmc的答案对我有用。它会回荡织补终止(y / n)吗?消息虽然到此结束,但并不会因此而停止。

–ggb667
2014年1月24日19:02

#3 楼

按两次Ctrl + C。

评论


这将不起作用,而是重复提示。

–乔伊
09年9月17日下午5:25

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

–塞巴斯蒂安·迪奥(Sebastien Diot)
2014-4-10 11:48



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

–vladr
2015年5月12日17:35

@vladr按住Ctrl并再次轻按C而不是先按Y再按Enter,将变得无限容易。

–尼克T
2015年12月14日18:27



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

–基本
16 Mar 6 '16 at 4:19

#4 楼

安装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上进行了link带式访问。

IMO太棒了!

评论


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

–iono
13年4月22日在4:43



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

– Macke
13年4月22日在7:53

啊,仍然没有骰子。微软,深深地叹了口气,上帝的份...

–iono
13年4月23日在18:00

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

– schlamar
15年1月14日在12:13

相关:对于使用cmder的用户,此设置为on \ cmder \ config \ settings。在这里查看相关的问题github.com/cmderdev/cmder/issues/1666

– edmundo096
18年2月27日在16:54

#5 楼

如果您在应用程序正常完成后不需要在批处理文件中执行任何操作,则使用start命令可确保在按Ctrl-C时批处理文件已完成。因此该消息将不会出现。

例如:

@echo off

set my_command=ping.exe
set my_params=-t www.google.com

echo Command to be executed by 'start': %my_command% %my_params%

:: When NOT using /B or /WAIT then this will create a new window, while
:: execution of this very batch file will continue in the current window:

start %my_command% %my_params%

echo.
echo This line will be executed BEFORE 'start' is even finished. So, this
echo batch file will complete BEFORE one presses Ctrl-C in the other window.
echo.

:: Just for testing use 'pause' to show "Press any key to continue", to see
:: the output of the 'echo' commands. Be sure to press Ctrl-C in the window
:: that runs the 'ping' command (not in this very window). Or simply remove
:: the next line when confused:

pause


(在Windows XP上经过测试。)

评论


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

– Arjan
09-09-4 18:48

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

–乔伊
09年9月5日在8:54

+1对我有用。但是,/ b关闭Ctrl + C处理(很烦人)。

–尼克·博尔顿(Nick Bolton)
2010-4-10 14:58

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

– Helgi
2012年4月18日在18:46

(从Windows 7来讲,不确定是否适用于XP)Microsoft聘用的没有思想的开发人员编写start命令的代码,使该窗口的标题同时成为强制性和可选性的愚蠢决定(以一种相当混乱的方式)。因此,如果您的%my_command%用双引号引起来,它将成为窗口的标题,而%my_params%中的第一个参数将成为命令。为了安全起见,请使用“此处有一些标题”开头%my_command%%my_params%。大多数人只使用“”,并诅咒开发人员不使用/ TITLE或/ T选项来设置标题。

– ADTC
2015年6月25日4:09

#6 楼

我一直渴望避免“终止批处理作业”提示的愿望。

我最近的顿悟是通过替换一只手(或控制台窗口)来减轻负担cmd.exe的另一个实例。这是通过在start cmd /k文件中通过exit执行命令/程序后紧接着执行.BAT来完成的。

原始控制台窗口消失,可以通过Ctrl-C干净地停止替换控制台窗口。

考虑以下示例,该示例可以被Ctrl + C中断,或允许其完成,则将用户返回到traceroute提示符:

@echo off

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

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


新命令解释器的环境替换可能并不适合所有人,但肉眼可见,看起来很适合我。

评论


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

–基本
2012年8月6日15:34

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

–塞巴斯蒂安·戈德莱特(Sebastian Godelet)
15年5月7日在16:23

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

–mklement0
18年6月16日在22:35



为什么使用“ cmd / k”(保持解释器处于打开状态)而不是“ / c”?只是为了能够看到命令的输出?

–劳尔·萨利纳斯-蒙塔古多
19年3月22日在7:15

#7 楼

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中读取,则此方法将无效。

–詹姆士林
17年7月29日在0:09

我喜欢这种方法的地方是,可以将其压缩为一行,然后粘贴到原始脚本的顶部:IF“%JUSTTERMINATE%” NEQ“ OKAY”设置为“ JUSTTERMINATE = OKAY”并致电%0%*
– Jez
20年7月16日在2:42

#8 楼

请参阅此堆栈溢出问题。

但是,修补cmd.exe并不是我要做的事情。

#9 楼

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

在Ctrl-C上取消批处理文件:在按Control-C时没有通常的提示,取消批处理文件处理。

截屏:

如果您以前从未听说过TCC / LE,请访问以下站点:

TCC / LE替代了CMD命令行(默认的Windows命令提示符)。 TCC / LE是CMD的超集,具有111个内部命令(CMD少于40个),240个内部变量和函数以及对现有CMD命令的数百种增强功能。
TCC / LE可与现有的命令行应用程序一起使用和批处理文件,但是在命令行和批处理文件功能方面进行了重大改进,并在命令提示符窗口中添加了数千种新功能。

我使用TCC / LE已有多年了,之前使用过4NT。我对此非常有爱,可以推荐它。我仍然不使用它的唯一原因是因为我现在几乎只使用PowerShell。

#10 楼

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

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

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

#11 楼

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

#12 楼

只需在命令末尾添加

评论


我认为您可能是指 nul将所有stdout发送到null)。

–布赖恩·菲利普斯(Brian Phillips)
2011-12-7 13:54

#13 楼

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

我选择使用的解决方案是使用“开始”运行批处理,与其他答案类似,但是从PowerShell提示符下(或选择CMD的PowerShell解释器方法)。 />
现在是2018年,并且在Windows 10中,Microsoft已开始使用PowerShell作为首选命令提示符来取代CMD,因此默认情况下它可以在GUI中随时使用。

Start是一个Start-Process的别名。

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

默认情况下它不会等待,因此除了该命令外,没有其他参数是必需的。

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

在PowerShell脚本中,必须先启动它们的路径才能启动,因此我将我的批处理文件作为.\host.bat运行。

#14 楼

取消“终止批处理作业(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
)


#15 楼

如果您使用Hyper终端,抑制确认的最简单方法是添加hyper-yes插件。

评论


为什么要投票?我仅在使用Hyper时表示。使用Windows时,实际上是一个很好的解决方案。

– Ricky Boyce
18年11月9日在22:25

问题是关于cmd.exe。

–劳尔·萨利纳斯-蒙塔古多
19 Mar 22 '19在7:04

#16 楼

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

评论


没为我工作。

– Helgi
2012年4月18日在18:47