首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在“设置Ctrl+C”提示下用/p取消Windows批处理脚本会产生不一致的行为?

为什么在“设置Ctrl+C”提示下用/p取消Windows批处理脚本会产生不一致的行为?
EN

Stack Overflow用户
提问于 2021-12-14 22:08:31
回答 1查看 301关注 0票数 1

这是脚本foo.cmd:

代码语言:javascript
运行
复制
@echo off
echo hi
set /p foobar="???"
echo bye

set /p提示下,我按Ctrl+C取消脚本。在这一点上,有几种可能发生的事情之一,似乎是随机选择的:

  1. ^C出现,Terminate batch job (Y/N)?
  2. ^C出现,然后是The syntax of the command is incorrect.,然后脚本终止,没有回显bye.
  3. ^C,脚本继续,回显bye.

我也看到过像1或2这样的情况,但是^C出现在“终止”提示或语法错误消息之后。

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

代码语言:javascript
运行
复制
    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

EN

Stack Overflow用户

回答已采纳

发布于 2021-12-15 07:13:57

set /pcmd的内部命令之一,等待输入。停止进程的CTRL+C在内部扼杀了set /p进程。

正如另一个内部进程timeout所演示的那样,结果是相似的,但是有一个实例将^C字符用换行符分隔开。这个批处理文件只包含timeout /t 5,然后我随机地执行CTRL+C

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

代码语言:javascript
运行
复制
@echo off
echo hi
set /p foobar="???" || cmd /c exit -1073741510
echo bye

当运行此命令并在Enter提示符下按下set /p时,将完成set命令,在发出^C后直接执行该命令。对于每次运行,结果将保持相同,因为CTRL+C只有要关闭的主进程:

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70356107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档