如何在PowerShell中禁止“终止批处理作业(Y / N)”确认?

问题描述 投票:13回答:2

当我在PowerShell中按Ctrl + C时,我收到:

终止批处理作业(是/否)?

https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation类似,但Windows PowerShell除外。

PowerShell是否提供了比CMD更多的批处理作业控制?

node.js powershell job-control
2个回答
7
投票

该行为既不是由PowerShell引起的,也不是PowerShell可以更改它(由PowerShell source-code repo不包含提示消息证明)。

行为内置于cmd.exe中 - Powershell,在这种情况下,调用.cmd文件(批处理文件),由cmd.exe解释。

  • 如果您明确控制目标可执行文件的调用,可以通过转移到Powershell来解决这个问题 - 请注意,这有其自身的注意事项,请参见下文。
  • 如果您没有明确地控制目标可执行文件的调用,那么您运气不好(除非您愿意安装第三方cmd.exe替换)并且必须按两次Ctrl + C才能终止执行。
  • 一个[n个不明智的]解决方法是修改cmd.exe二进制文件 - 请参阅article with instructions on how to patch the cmd.exe executable in order to suppress the prompt。此外,您可以在GitHub上发布功能请求,以请求在源处修复此行为,但由于向后兼容性原因不太可能发生这种情况。

为了证明这种行为:

这些示例假设已安装Node.js,因此node.exe位于您的PATH中:

首先,直接调用node.exe,使用紧密循环,要求您按Ctrl + C终止进程。

PS> node -e "while (true);"

正如您所看到的,按Ctrl + C会立即终止该过程 - 没有确认提示。

现在,让我们创建一个示例批处理文件,该文件调用相同的命令并调用该批处理文件:

PS> "@echo off`nnode -e `"while (true);`"" | Set-Content test.cmd
PS> ./test.cmd

正如您所看到的,按Ctrl + C现在会显示不需要的Terminate batch job (Y/N)?提示。 (如果从cmd.exe运行批处理文件,则会得到相同的行为。)

为了证明gulp是一个cmd文件:

你说你是通过gulp的CLI运行你的命令。

在Windows上,gulp CLI的入口点是gulp.cmd - 即批处理文件。这就是它一般用于npm-package“二进制文件”(可执行文件)的工作方式,它实现为JS文件或shell脚本。

gulp调用gulp.cmd可以验证如下:

# Execute from a project folder that has `gulp` installed as a dependency.
# If `gulp` is installed *globally* 
# Note: CLI `npx` requires npm version 5.2.0+
PS C:\some\NodeJs\project> npx where gulp

你会看到类似的东西:

C:\some\NodeJs\project\node_modules\.bin\gulp
C:\some\NodeJs\project\node_modules\.bin\gulp.cmd

请注意,where.exe还列出了无扩展的Unix-shell脚本...\gulp;但是,从cmd.exe / Powershell这样的shell脚本不能直接执行,而且是执行的...\gulp.cmd - 批处理文件。 (如果有疑问,请在@set /p dummy="Press a key"文件的开头放置一个命令,如gulp.cmd,当你调用不带gulp扩展名的.cmd时,你会看到这个命令执行。 另请注意,没有gulp.exe。)

更一般地说,在Windows上,项目的node_modules\.bin子文件夹包含CLI的CLI入口点对,这些CLI带有项目依赖于本地的软件包:

  • node_modules\.bin\<some-cli>是Unix shell脚本(其执行解释器通过其shebang line控制)。
  • node_modules\.bin\<some-cli>.cmd是Windows的帮助程序批处理文件。

Future considerations:

在npm模块的上下文中,如果PowerShell脚本(*.ps1)被用作Windows上的帮助程序脚本,问题就会消失。有npmyarn和类似软件的门票可以做到这一点。还有一些缺点:

  • *.ps1文件不能直接从PowerShell外部执行,特别是来自cmd.exe和文件资源管理器(并且更改它是非常重要的)。
  • 从Windows 10开始,PowerShell仍然没有完全取代cmd.exe作为默认shell。

从PowerShell调用时,会找到并运行*.ps1文件,因此现在可能的折衷方案是npm项目还提供*.ps1帮助程序脚本,该脚本优先于同名的*.cmd文件。


1
投票

正如另一个答案所指出的,正确的解决方法是用cmd版本替换ps1脚本。

然而,当提示出现时,Hyper shell用户的另一个解决方法是Hyper yes, a plugin that automatically hits y for you

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.