由于我不想进一步讨论的原因,我需要从 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
时.
修改批处理文件以调用
Code.exe
,如下所示:
start /min "" cmd.exe /c "%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe"
也就是说,通过 cmd.exe
创建的另一个控制台窗口
调用它。 这可以防止
Code.exe
连接到调用者的 控制台(以打印诊断输出),从而阻止
Start-Process -Wait
检测批处理文件本身何时终止。