node.js - 如何在PowerShell中取消 “Terminate batch job (Y/N)”确认?

标签 node.js powershell job-control

当我在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解释。

  • 如果您明确控制目标可执行文件的调用,则可以通过移至Powershell 来解决此问题-请注意,这有其自身的考虑因素,请参见下文。
  • 如果您没有显式控制目标可执行文件的调用,那么(除非您愿意安装第三方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运行批处理文件,您将得到相同的行为。)
    为了证明gulpcmd文件,请执行以下操作:
    您说您正在通过 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上的帮助程序脚本,则该问题将消失。有npmyarn和类似软件的票据可用于执行此操作。还有一些缺点:

    不能从PowerShell外部直接执行
  • *.ps1文件,尤其是从cmd.exe和File Explorer(以及不重要​​的更改)中直接执行这些文件。
  • 从Windows 10开始,PowerShell仍未完全取代cmd.exe作为默认 shell 。

  • 当从PowerShell调用时,将找到一个*.ps1文件并在进程中运行,因此目前可能的妥协是npm项目还提供*.ps1帮助程序脚本,该脚本优先于同名的*.cmd文件。
  • 更新:Dario指出,替代软件包管理器 yarn 现在确实包含*.ps1脚本,因此从PowerShell中运行它可以解决该问题。
  • 关于node.js - 如何在PowerShell中取消 “Terminate batch job (Y/N)”确认?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39085380/

    相关文章:

    javascript - 用 Mocha 测试 Promise 链

    node.js - 如何在 travis 上测试构建脚本更改,而无需 checkin 每个更改的代码

    powershell - 从 Com 对象获取进程 ID

    c - 如何为输入 la shell 的 `bg` 命令创建后台进程 block ?

    bash - bg/fg 在命令行循环中

    node.js - Gradle Moowork Node 插件

    javascript - Mongoose 查找具有多个条件的查询

    linux - 使用 PowerShell 从 com 端口获取 Linux 设备 IP 地址

    c# - .NET 枚举类型实际上是可变值类型吗?