【发布时间】:2022-01-18 04:35:54
【问题描述】:
这是脚本 foo.cmd :
@echo off
echo hi
set /p foobar="???"
echo bye
当set /p 提示时,我按Ctrl+C 取消脚本。此时,发生了几种可能的事情之一,似乎是随机选择的:
-
出现
^C,后面跟着Terminate batch job (Y/N)? -
^C出现,然后是The syntax of the command is incorrect.然后脚本终止,没有回显bye。 -
^C出现,脚本继续,回显bye。
我也见过类似 1 或 2 的情况,但 ^C 出现在“终止”提示或语法错误消息之后。
连续三次尝试的实际输出:
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
【问题讨论】:
-
我在批处理文件运行时看到了这种行为的变化。显然 cmd.exe 正在逐行读取文件,并且在执行命令的过程中可能会被移动的行弄糊涂。
-
@kindall 感谢您的评论。就我而言,我没有在文件运行时对其进行任何更改。我唯一能想到的可能会无意中改变的是我按下和释放 Ctrl+C 的速度(但我没有注意到我的手指速度与我得到的结果之间有任何关联。)
-
实际上,我刚刚看到另一种情况,我看到
^C后跟bye,只有然后我才收到Terminate batch job (Y/N)?消息。更奇怪的是,我得到了一个插入符号^,然后是bye,然后是C,然后是Terminate...消息。 -
现在,我最好的猜测是有一个线程等待
set /p的输入,另一个线程检查 Ctrl+C 然后取消作业。也许当我按下 Ctrl+C 时,两个线程都会读取它,这会引发两者之间的竞争。但我真的只是在这里猜测。
标签: batch-file cmd