这是脚本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
发布于 2021-12-15 07:13:57
set /p
是cmd
的内部命令之一,等待输入。停止进程的CTRL+C
在内部扼杀了set /p
进程。
正如另一个内部进程timeout
所演示的那样,结果是相似的,但是有一个实例将^C
字符用换行符分隔开。这个批处理文件只包含timeout /t 5
,然后我随机地执行CTRL+C
:
为了证明CTRL+C
正在扼杀示例中的内部进程,然后是主进程,我们可以在脚本本身中创建CTRL+C
( exit code
create ^C
的所有功劳都归于用户DBenham
)。
@echo off
echo hi
set /p foobar="???" || cmd /c exit -1073741510
echo bye
当运行此命令并在Enter
提示符下按下set /p
时,将完成set
命令,在发出^C
后直接执行该命令。对于每次运行,结果将保持相同,因为CTRL+C
只有要关闭的主进程:
https://stackoverflow.com/questions/70356107
复制相似问题