batch-file - 为什么在 "set/p"提示时使用 Ctrl+C 取消 Windows 批处理脚本会产生不一致的行为?

标签 batch-file cmd

这是脚本 foo.cmd :

@echo off
echo hi
set /p foobar="???"
echo bye

set/p提示时,我按Ctrl+C取消脚本。此时,可能会发生以下几种情况之一,这似乎是随机选择的:

    出现
  1. ^C,后跟 终止批处理作业(是/否)?
  2. ^C 出现,然后是 命令的语法不正确。 然后脚本终止,不回显 bye
  3. ^C 出现,脚本继续,回显 bye

我也见过类似 1 或 2 的情况,但 ^C 出现在“Terminate”提示或语法错误消息之后。

连续三次尝试的实际输出:

    C:\Users\Me\Documents>foo.cmd
    hi
    ???^CThe syntax of the command is incorrect.
    
    C:\Users\Me\Documents>foo.cmd
    hi
    ???^Cbye
    
    C:\Users\Me\Documents>foo.cmd
    hi
    ???^CTerminate batch job (Y/N)? y
    
    C:\Users\Me\Documents>

我发现了 7 年前的一个相关问题,但答案没有包含任何解释为什么会发生这种情况:set /p reads ctrl+c as input instead of terminating the script

最佳答案

set/p 位于 cmd 内部,是等待输入的命令之一。 CTRL+C 旨在停止进程,正在内部终止 set/p 进程。

正如另一个内部进程 timeout 所演示的,结果相似,但存在一个 ^C 字符由换行符分隔的情况。该批处理文件仅包含 timeout/t 5 ,然后我随机执行 CTRL+C : enter image description here

为了证明 CTRL+C 正在杀死示例中的内部进程,然后是主进程,我们可以在脚本本身中创建 CTRL+C (所有功劳均归于用户 DBenham,因为 exit code 创建 ^C:

@echo off
echo hi
set /p foobar="???" || cmd /c exit -1073741510
echo bye

当运行此命令并在 set/p 提示符下按 Enter 时,将完成 set 命令,紧接在 ^ 之后C 已发布。每次运行的结果将保持相同,因为 CTRL+C 仅需要关闭主进程:

enter image description here

关于batch-file - 为什么在 "set/p"提示时使用 Ctrl+C 取消 Windows 批处理脚本会产生不一致的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70356107/

相关文章:

python - 如何打开执行 python 文件的终端

.net - 如何将输入发送到控制台,就像用户正在打字一样?

windows - 如何测量 for 循环每次迭代所需的时间?

batch-file - 通读每一行并使用批处理文件检查该行是否以特定字符串开头

windows - 从批处理文件创建空白文件

web - 如何为代码实验室配置 Firebase SDK?

java - 在运行时通过 java 中的命令提示符加载配置文件 (project.properties)

php - 如何使用 PHP 的参数执行 .exe 并将输出放入 txt 文件?

windows - 避免在 Windows 批处理文件的 for 循环中打印

java - sejda-console.bat 传递带有空格的参数