【问题标题】:How can I suppress “Terminate batch job (Y/N)” confirmation in PowerShell?如何在 PowerShell 中禁止“终止批处理作业 (Y/N)”确认?
【发布时间】:2016-08-22 17:25:47
【问题描述】:

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

终止批处理作业 (Y/N)?

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

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

【问题讨论】:

  • 除非您从 PowerShell 运行批处理脚本,否则您不应收到该消息。这些作为 CMD 子进程启动,因此它们的行为与任何其他 CMD/批处理进程一样。
  • FWIW,如果您按 Ctrl-Pause(Break),PowerShell 可以中断正在运行的脚本。
  • 如果您使用npm start 运行节点应用程序,该进程会自动包装到 CMD/批处理进程中。尝试直接使用node app.js 或其他方式运行应用程序。
  • 有关使用 Autohotkey 在 Powershell 中工作的解决方案,请参阅:superuser.com/a/1703017/351521

标签: node.js powershell job-control


【解决方案1】:

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

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

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

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

  • A[n ill-advised] 解决方法修改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 [请参阅底部的更新] - 即,批处理文件 . 这就是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>.cmdWindows 的帮助批处理文件。

更新和未来考虑:

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

  • *.ps1 文件不能从 PowerShell 外部直接执行,尤其是从 cmd.exe 和文件资源管理器(更改它是不平凡的)。

  • 从 Windows 10 开始,PowerShell 仍未完全取代 cmd.exe 作为默认 shell(如果有的话,也不会很快取代)。

从 PowerShell 调用时,会找到一个 *.ps1 文件并在进程中运行,因此可能的解决方案是 npm 项目提供*.ps1帮助脚本,这将优先于*.cmd同名文件。

  • 更新
    • npm 的最新版本(在 6.14.10 中验证)确实可以安装此类 *.ps1 文件。
    • 替代包管理器yarn因为v2似乎根本不再使用批处理文件,所以原来的问题绕过那里; (相比之下,v1 仍然(仅)使用批处理文件;从 v1 升级必须在每个项目的基础上完成,请参阅migration instructions)。

【讨论】:

  • 一如既往的好文章。你知道cmd是否监听除了SIGINT之外的任何其他信号来终止吗?
  • 谢谢,@MaximilianBurszley - 不幸的是,我不知道。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    @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
    

    【讨论】:

      猜你喜欢
      • 2017-04-22
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      相关资源
      最近更新 更多