35

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

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

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

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

4

3 回答 3

26

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

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

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

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

  • A[n ill-advised]解决方法修改cmd.exe二进制文件- 请参阅文章,其中包含有关如何修补cmd.exe可执行文件以抑制提示的说明。此外,您可以在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+Cnow 会出现不需要的Terminate batch job (Y/N)?提示。(如果您从 运行批处理文件,您会得到相同的行为cmd.exe。)

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

你说你正在通过gulpCLI 运行你的命令。

gulp在 Windows 上, CLI的入口点是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

你会看到类似的东西:

C:\some\NodeJs\project\node_modules\.bin\gulp
C:\some\NodeJs\project\node_modules\.bin\gulp.cmd

请注意,where.exe它还列出了无扩展名的 Unix -shell 脚本...\gulp;但是,from 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 脚本(其执行解释器通过其shebang 行控制)。
  • 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 升级必须在每个项目的基础上完成,请参阅迁移说明)。
于 2018-06-16T22:58:28.483 回答
5

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

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

在此处输入图像描述

于 2019-02-28T18:01:16.707 回答
-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
于 2021-01-10T22:30:26.937 回答