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

mik*_*ana 16 powershell job-control node.js

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

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

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

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

mkl*_*nt0 10

行为既不是由PowerShell引起的,也不是PowerShell可以更改的(由不包含提示消息的PowerShell源代码存储库证明)。

行为是内置的cmd.exe -在这种情况下,Powershell正在调用一个.cmd文件(批处理文件),该文件由解释cmd.exe

  • 如果您明确控制目标可执行文件的调用,则可以通过移至Powershell来解决此问题 -注意这有其自身的考虑因素,请参见下文。

  • 如果您没有显式控制目标可执行文件的调用,那么您将很不走运(除非您愿意安装第三方cmd.exe替代品),并且必须Ctrl+C 两次以终止执行。

  • [n-ad-advised] 解决方法修改cmd.exe二进制文件 -请参阅有关如何修补cmd.exe可执行文件以抑制提示的说明的文章。此外,您可以在GitHub上发布功能请求,以要求在源头解决此问题,尽管由于向后兼容的原因不太可能发生。

演示行为:

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

首先,node.exe使用紧密循环直接调用,这需要您按Ctrl+C来终止该过程。

PS> node -e "while (true);"
Run Code Online (Sandbox Code Playgroud)

就像您将看到的那样,Ctrl+C 立即按下将终止过程-没有确认提示。

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

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

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

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

您说您正在通过gulp的CLI 运行命令。

在Windows上,gulpCLI 的入口点是gulp.cmd-即批处理文件这通常适用于npm以JS文件或Shell脚本实现的-package“二进制文件”(可执行文件)。

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
Run Code Online (Sandbox Code Playgroud)

您会看到类似以下内容:

C:\some\NodeJs\project\node_modules\.bin\gulp
C:\some\NodeJs\project\node_modules\.bin\gulp.cmd
Run Code Online (Sandbox Code Playgroud)

注意,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行控制)。
  • node_modules\.bin\<some-cli>.cmdWindows的帮助程序批处理文件。

未来考虑:

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

  • *.ps1文件不能从PowerShell外部直接执行,特别是不能从cmd.exe文件资源管理器和文件资源管理器中直接执行(并且更改不容易)。

  • cmd.exe自Windows 10起,PowerShell仍未完全取代为默认外壳。

从PowerShell调用*.ps1将找到一个文件并在进程中运行,因此,目前可能的折衷办法是使npm项目提供一个*.ps1帮助程序脚本,该脚本优先于*.cmd同名文件。


mik*_*ana 6

正如其他答案所指出的,正确的解决方法cmd是将脚本替换为ps1版本。

然而, Hyper shell 用户的另一个解决方法是“Hyper yes”,这是一个y在出现提示时自动为您点击的插件。

在此输入图像描述