为什么 Electron 应用程序在使用启动命令从批处理脚本启动时会阻止 PowerShell?

问题描述 投票:0回答:1

由于我不想进一步讨论的原因,我需要从 PowerShell 脚本启动批处理脚本并等待批处理脚本完成。

在批处理脚本中,我想启动一个可执行文件异步,然后不久后退出批处理脚本。一旦批处理脚本终止,我还希望 PowerShell 脚本退出。

这是两个脚本的基本示例,它可以实现我想要的功能:

startExe.bat:

start "" "C:\Windows\System32\calc.exe"

exit

runStartExe.ps1(在同一目录中):

Start-Process -FilePath "startExe.bat" -Wait;

在这种情况下,计算器会启动,并且在 PowerShell 脚本按预期终止后不久。

但是,当我尝试使用基于 Electron 的应用程序执行相同的操作时,假设您已安装 Visual Studio Code

startExe.bat:

start "" "C:\Users\%username%\AppData\Local\Programs\Microsoft VS Code\Code.exe"

exit

PowerShell 脚本将被阻止,直到应用程序关闭。

当仅运行批处理脚本时,它在所有情况下都可以正常退出。

为什么会出现这种情况?我该如何预防?

其他发现

在测试时,我注意到 Windows 10 和 11 之间的行为似乎存在差异。即,当我在批处理脚本中运行

start "" "C:\Windows\System32\notepad.exe"
时,与基于电子的应用程序相同的锁定会发生在 Windows 10 中,但不会发生在 Windows 中11. 似乎在 Windows 10 中,每个嵌入字符串
!This program cannot be run in DOS mode.
的可执行文件都会发生这种情况(大多数程序都有,但例如 Windows 计算器没有此字符串),而在 Windows 11 中,它只会发生在基于 Electron 的程序中。

我还注意到,当我在启动应用程序之后和退出语句之前引入

timeout 5
时,批处理脚本也会锁定基于电子的应用程序。

此外,我注意到选项

-PassThru
-NoNewWindow
似乎在 PowerShell 脚本中有所不同,但是我仍然无法可靠地完成这项工作,特别是在批处理脚本中引入
timeout 5
时.

windows powershell batch-file cmd electron
1个回答
0
投票

修改批处理文件以调用

Code.exe
,如下所示:

start /min "" cmd.exe /c "%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe"

也就是说,通过 cmd.exe 创建的另一个控制台窗口

调用它。
这可以防止 
Code.exe
 连接到 
调用者的 控制台(以打印诊断输出),从而阻止 Start-Process -Wait
 检测批处理文件本身何时终止。

© www.soinside.com 2019 - 2024. All rights reserved.