行为既不是由 PowerShell 引起的,也不是 PowerShell 可以改变的(由不包含提示消息的PowerShell source-code repo 证明)。
行为内置于cmd.exe - 在这种情况下,Powershell 正在调用.cmd 文件(批处理文件),该文件由@987654330 解释@。
演示行为:
这些示例假定已安装 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 "binaries"(可执行文件)的一般工作方式,实现为 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 还列出了 extension-less Unix-shell 脚本,...\gulp;但是,从 cmd.exe / Powershell 开始,这样的 shell 脚本不能直接执行,而是由 ...\gulp.cmd - 批处理文件 - 执行的。
(如果有疑问,请在 gulp.cmd 文件的开头放置一个命令,例如 @set /p dummy="Press a key",当您调用不带 .cmd 扩展名的 gulp 时,您会看到该命令执行。
另请注意,没有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 的帮助批处理文件。
更新和未来考虑:
在 npm 模块的上下文中,如果将 PowerShell 脚本 (*.ps1) 用作 Windows 上的帮助程序脚本,问题就会消失。有npm、yarn 和类似软件的门票可以做到这一点。还有一些缺点:
从 PowerShell 调用时,会找到一个 *.ps1 文件并在进程中运行,因此可能的解决方案是 npm 项目还提供*.ps1帮助脚本,这将优先于*.cmd同名文件。
-
更新:
npm 的最新版本(在 6.14.10 中验证)确实可以安装此类 *.ps1 文件。
- 替代包管理器
yarn,因为v2似乎根本不再使用批处理文件,所以原来的问题绕过那里; (相比之下,v1 仍然(仅)使用批处理文件;从 v1 升级必须在每个项目的基础上完成,请参阅migration instructions)。