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

Sri*_*nth 189 windows batch command-line

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

Gri*_*ave 69

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

script2.cmd < nul
Run Code Online (Sandbox Code Playgroud)

每次我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
)
Run Code Online (Sandbox Code Playgroud)

  • 它有效,除非您需要批量输入用户。 (19认同)
  • 这适用于 Windows 7。 (3认同)
  • 如果您从其内部调用批处理文件(不使用 CALL 命令),则执行将“永久”转移。如果 STDIN 被重定向到 NUL,任何“终止批处理作业”提示仍将出现,但不会等待(因为 STDIN 已消失)输入。这对我有用... (2认同)
  • @William,只是调用脚本对我不起作用,但我想出了一个解决方法:`@IF ""=="%1" (@%0 CALLED &lt; nul) ELSE (@[your command])` . 递归调用自身,但第二次使用参数。如果您的脚本有参数,您可能会使用第一个未使用的位置参数。如果您的脚本有很多参数,那可能会有问题。我的脚本不需要参数或用户输入。 (2认同)

Kir*_*sky 67

Ctrl+C两次。

  • @SebastienDiot 您在有可能永久破坏数据的脚本上尝试了一种新技术?那是……勇敢。 (32认同)
  • 这不起作用,而是重复提示。 (14认同)
  • 我只是通过这样做杀死了我的数据库!脚本正在等待“暂停”,所以我做了CTRL-C,然后提示来了,所以我又做了CTRL-C,然后批处理文件愉快地继续,并删除了我的数据库!@see http://superuser.com/questions/740004/why-does-ctrl-c-on-terminate-batch-job-prompt-means-carry-on (12认同)
  • 那不是OP问的。他可以很容易地在 ^C 后输入“N”。 (4认同)
  • @vladr 按住“Ctrl”并再次点击“C”比点击“Y”然后点击“Enter”要容易得多。 (3认同)
  • @Basic 首先,它是“我的”(个人)数据库,而不是生产系统,所以只有“失去生产力”(再次下载和恢复数据库),而不是“丢失数据”。其次,“CTRL-C”如何成为“新技术”?:D (2认同)
  • @vladr 有实际区别。如果您从 cmd 运行脚本(而不是双击脚本),`Ctrl c` + `y` 会将 `y` 放入命令历史记录中,这意味着如果你按一次 `up` 键,你会得到 `y ` 而不是实际的前一个命令。`Ctrl c` 两次就没有这个问题。 (2认同)

Bin*_*fit 65

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

  • 这令人失望:( (78认同)
  • 尽管可能确实无法使解释器的行为有所不同,但使用 `start` 就像 http://superuser.com/questions/35698/how-to-supress-terminate-batch-job-yn-confirmation/35741 建议的 sgmoore #35741 对我来说似乎是一个非常好的解决方法。 (5认同)

Mac*_*cke 41

安装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
Run Code Online (Sandbox Code Playgroud)

这然后“适用于”任何cmd.exe窗口。您无需更改正在运行的内容或其他内容,因为 clink 附带cmd.exe. 1

真棒,海事组织!


1但是您需要关闭并重新打开cmd.exe才能生效。

  • 原clink的作者有一段时间没有更新该项目了。有一个实际版本,其中解决了许多问题并添加了功能。获取:https://chrisant996.github.io/clink/ (5认同)
  • 啊,还是没有骰子。*深深的叹息*微软,看在上帝的份上…… (3认同)
  • @iono 你有非英语的 Windows 版本吗?在这种情况下,在几天前 0.4.3 发布之前,clink 无法自动回答提示:https://github.com/mridgers/clink/releases/tag/0.4.3 (3认同)
  • 相关:对于那些**使用cmder**,设置在`\cmder\config\settings`。请参阅此处相关的问题 https://github.com/cmderdev/cmder/issues/1666 (3认同)
  • 对于 ConEmu 用户:设置位置位于:`c:\Program Files\ConEmu\ConEmu\clink\profile\settings`。但实际上你不需要知道它。只需在 Adminstartor 下运行“cmd”(使配置文件可写,因为它位于“C:\Program Files”下,默认情况下只有管理员可以更改文件)并运行“clink set Terminate_autoanswer 1”。这不仅为当前会话设置值,而且还写入配置文件。如果运行此命令时不带最后一个参数,您还可以看到当前值。如果您只运行“clink set”,您甚至可以看到配置文件的位置。 (3认同)

sgm*_*ore 19

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

例如:

@回声关闭

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

echo 'start' 执行的命令:%my_command% %my_params%

:: 当不使用 /B 或 /WAIT 时,这将创建一个新窗口,而
:: 这个批处理文件的执行将在当前窗口中继续:

开始 %my_command% %my_params%

回声。
echo 此行将在 'start' 完成之前执行。所以这
echo 批处理文件将在另一个窗口中按 Ctrl-C 之前完成。
回声。

:: 只是为了测试使用“暂停”来显示“按任意键继续”,看看
:: 'echo' 命令的输出。请务必在窗口中按 Ctrl-C
:: 运行“ping”命令(不在这个窗口中)。或者干脆删除
:: 困惑时的下一行:

暂停

(在 Windows XP 上测试。)

  • (从 Windows 7 说起,不确定是否适用于 XP)*Microsoft* 聘请的*不假思索的* 开发人员编写`start` 命令的代码做出了愚蠢的决定,将窗口的 **title** 设为强制性和可选性同时 - 以一种相当混乱的方式。因此,如果你的 `%my_command%` 被双引号括起来,它就会成为窗口的 *title*,并且 `%my_params%` 中的第一个参数成为 *command*。为安全起见,请使用`start "some title here" %my_command% %my_params%`。大多数只是使用`""`并诅咒开发人员没有使用`/TITLE`或`/T`选项来设置标题。 (9认同)
  • 如果您双击批处理文件,这很好。但是如果在控制台中启动批处理文件呢? (4认同)

Vip*_*eek 14

我一直在与这种避免“终止批处理作业”提示的愿望作斗争。

我最近的顿悟是通过用另一个实例替换一个实例(或控制台窗口)有点花招cmd.exe。这是start cmd /k通过exit.BAT文件中紧接着执行命令/程序来完成的。

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

考虑以下 atraceroute可以被Ctrl+中断C或允许完成的示例,将用户返回到C:\>提示:

@echo off

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

start cmd /k tracert -w %timeout% %1
exit
Run Code Online (Sandbox Code Playgroud)

新命令解释器的环境替代可能并不适合所有人,但从肉眼来看,对我来说看起来和工作得很好。


Ale*_*Mev 13

Gringo 的解决方案很好,但不适用于传递参数列表(即python myscript.py %*)的脚本,因为SHIFT不更新%*。有一些变通方法,但它们有一定的局限性。

这是我最终得到的修改:

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

99.(9)% 完美无瑕。


Joe*_*oey 5

请参阅此堆栈溢出问题

但是,修补 cmd.exe 不是我会为此做的事情。


Cha*_*per 5

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。