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

时间:2016-08-22 17:25:48

标签: node.js powershell job-control

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

  

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

  • 如果您明确控制目标可执行文件的调用,可以通过转移到Powershell 来解决此问题 - 请注意,这有其自身的注意事项,请参阅下文。

  • 如果您没有明确控制目标可执行文件的调用,那么运气不佳(除非您愿意安装第三方cmd.exe替换)并且必须 Ctrl + C 两次 才能终止执行。

  • [错误的] 解决方法修改cmd.exe二进制 - 请参阅{{3 }}。此外,您可以在article with instructions on how to patch the cmd.exe executable in order to suppress the prompt上发布功能请求,以请求在源处修复此行为,但由于向后兼容性原因不太可能发生这种情况。

演示行为:

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

首先,直接调用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运行批处理文件,则会得到相同的行为。)

要证明gulpcmd文件:

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

在Windows上,gulp CLI的入口点为gulp.cmd - 即批处理文件这就是它的工作原理general npm - 包“二进制”(可执行文件),实现为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脚本(其执行解释器通过其gulp控制)。
  • node_modules\.bin\<some-cli>.cmd Windows 的帮助程序批处理文件。

未来考虑因素:

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

  • *.ps1文件不能直接从PowerShell外部执行,特别是来自cmd.exe和文件资源管理器(并且更改它是非常重要的)。

  • 从Windows 10开始,PowerShell仍然没有完全替换cmd.exe作为默认shell。

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

答案 1 :(得分:1)

如其他答案所述,正确的修复是将cmd脚本替换为ps1版本。

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

enter image description here

答案 2 :(得分:-2)

@echo off
start /w "" "C:\myfile.bat" 2>nul|findstr /i "termin"

if errorlevel 1 goto bypass


:bypass

echo hello by stexup YouTube channel!

timeout /t 5 >nul