当我在PowerShell中按 Ctrl + C 时,我会收到:
终止批处理作业(是/否)?
与https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation类似,但Windows PowerShell除外。
PowerShell是否提供了比CMD更多的批处理作业控制?
答案 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
运行批处理文件,则会得到相同的行为。)
gulp
是cmd
文件:您说您正在通过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上的帮助程序脚本,问题就会消失。有npm
,yarn
和类似软件的门票可以执行此操作。还有一些缺点:
*.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。
答案 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