Explorer进程关闭后PowerShell脚本A执行完成时冻结求助
问题场景
有两个PowerShell脚本:
- 脚本A:
... Start-Process PowerShell -Wait $PathToScriptB -WindowStyle Minimized ... Exit
脚本A通过Start-Process启动新窗口运行脚本B,并等待其执行完成。
- 脚本B:
... Start-Process $SetupFile -Wait ... Exit
脚本B包含应用静默安装代码,安装过程中Windows Explorer会自动关闭;脚本B执行完成后无报错正常退出,但脚本A执行剩余命令后出现冻结、无法退出;若Explorer未关闭,脚本A则能正常退出。
可能原因
当Explorer进程重启时,脚本A所在的PowerShell控制台会话与Explorer的桌面窗口管理器存在关联依赖,Explorer重启后这种关联被破坏,导致脚本A的进程无法正常释放资源或完成退出流程。
解决办法
修改脚本A的启动参数,让脚本B脱离交互式会话
启动脚本B的PowerShell进程时,添加-NoProfile和-NonInteractive参数,避免和桌面会话绑定,修改后的命令:Start-Process PowerShell -Wait -ArgumentList "-NoProfile -NonInteractive -File `"$PathToScriptB`"" -WindowStyle Minimized让脚本A脱离桌面会话运行
通过任务计划程序创建任务启动脚本A,设置任务在「不管用户是否登录都要运行」的模式下执行,这样脚本A的进程不依赖Explorer的桌面会话,Explorer重启不会影响其正常退出。在脚本B末尾手动重启Explorer
如果安装程序关闭Explorer后未自动重启,在脚本B的Exit前添加重启Explorer的代码,恢复桌面会话上下文:# 强制终止并重启Explorer Stop-Process -Name explorer -Force Start-Process explorer避免嵌套启动PowerShell进程
直接在脚本A中调用脚本B,而非启动新的PowerShell进程,减少会话依赖:& $PathToScriptB # 后续代码... Exit注意:这种方式下需要确保
$SetupFile的静默安装命令不会弹出窗口影响执行,可根据安装程序要求添加/quiet或/silent等参数。
内容的提问来源于stack exchange,提问作者MikeZetPL

