这是脚本 foo.cmd :
@echo off
echo hi
set /p foobar="???"
echo bye
当set/p
提示时,我按Ctrl+C
取消脚本。此时,可能会发生以下几种情况之一,这似乎是随机选择的:
-
出现
^C
,后跟终止批处理作业(是/否)?
^C
出现,然后是命令的语法不正确。
然后脚本终止,不回显bye
。^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 :
为了证明 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
仅需要关闭主进程:
关于batch-file - 为什么在 "set/p"提示时使用 Ctrl+C 取消 Windows 批处理脚本会产生不一致的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70356107/