当我在PowerShell中按Ctrl + C时,我收到:
Terminate batch job (Y/N)?
与https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation相似,但Windows PowerShell除外。
与CMD相比,PowerShell是否提供对批处理作业的更多控制?
最佳答案
行为既不是由PowerShell引起的,也不是PowerShell可以将其更改为(由PowerShell source-code repo不包含提示消息所证明)。
行为内置在cmd.exe
中-在这种情况下,Powershell会调用.cmd
文件(批处理文件),该文件由cmd.exe
解释。
cmd.exe
替代品)不走运,并且必须按Ctrl + C两次才能终止执行。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
-即批处理文件。 这通常适用于以JS文件或Shell脚本实现的npm
-package“binaries”(可执行文件)。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入口点:node_modules\.bin\<some-cli>
是Unix shell脚本(其执行解释器通过其shebang line控制)。 node_modules\.bin\<some-cli>.cmd
是Windows的帮助程序批处理文件。 future 考虑因素:
在npm模块的上下文中,如果将PowerShell脚本(
*.ps1
)用作Windows上的帮助程序脚本,则该问题将消失。有npm
,yarn
和类似软件的票据可用于执行此操作。还有一些缺点:不能从PowerShell外部直接执行
*.ps1
文件,尤其是从cmd.exe
和File Explorer(以及不重要的更改)中直接执行这些文件。cmd.exe
作为默认 shell 。当从PowerShell调用时,将找到一个
*.ps1
文件并在进程中运行,因此目前可能的妥协是npm
项目还提供*.ps1
帮助程序脚本,该脚本优先于同名的*.cmd
文件。yarn
现在确实包含*.ps1
脚本,因此从PowerShell中运行它可以解决该问题。 关于node.js - 如何在PowerShell中取消 “Terminate batch job (Y/N)”确认?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39085380/