Windows7设备远程升级PowerShell 5.1执行故障排查求助
PowerShell 批量升级Windows 7设备WMF 5.1问题修复方案
现有脚本核心问题
- 会话使用逻辑错误:
Enter-PSSession仅适用于交互式远程操作,脚本中同时混用Enter-PSSession和Invoke-Command会导致会话生命周期混乱,远程执行上下文异常中断 - 执行策略配置不生效:
Set-ExecutionPolicy未指定作用域与强制参数,默认仅对当前用户生效,远程调用场景下仍会被执行策略拦截 - 安装调用无等待、无返回:直接调用
Install-WMF5.1.ps1未捕获进程退出状态,且WMF安装过程会中断WinRM服务,远程会话会直接断开无法获取执行结果 - 文件删除时机错误:安装逻辑未完成就执行
Remove-Item删除安装源文件,会导致安装流程异常终止
修复后的脚本
foreach ($comp in $computers) { $comp.Name if(test-connection -ComputerName $comp.Name -quiet ){ $Destination = "\\$($comp.Name)\c$\Temp\" # 复制安装源 copy-item -path "\\10.1.32.161\New Client Setups\WMF_5.1_PowerShell\*" -Destination $Destination -recurse -force "`t 安装源复制完成" try { # 创建持久化PSSession $session = New-PSSession $comp.Name -Credential $cred -ErrorAction Stop $results = Invoke-Command -Session $session -ScriptBlock { # 配置全局执行策略 Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Force $ver = $PSVersionTable.PSVersion.Major $output = "`t PowerShell版本 : $ver`n" if ($ver -lt 5){ $output += "`t 需执行版本升级`n" # 启动独立powershell进程执行安装,捕获退出码,输出日志到本地文件 $installProcess = Start-Process powershell.exe -ArgumentList @( "-NoProfile", "-NonInteractive", "-ExecutionPolicy Bypass", "-File C:\Temp\Windows7_Server2008r2\Install-WMF5.1.ps1", "-AcceptEULA", "-AllowRestart" ) -Wait -PassThru -NoNewWindow $output += "`t 安装进程退出码:$($installProcess.ExitCode)`n" # 退出码0代表成功,3010代表需要重启生效 if ($installProcess.ExitCode -in 0,3010) { $output += "`t 升级执行成功,设备将自动重启`n" } else { $output += "`t 升级执行失败,退出码:$($installProcess.ExitCode)`n" } } return $output } $results # 确认升级完成后再删除安装文件,若设备已重启可跳过删除逻辑 if (-not $results.Contains("升级执行成功")) { Remove-item -Path "$Destination*" -recurse -Force -ErrorAction SilentlyContinue } } catch { "`t 远程操作失败:$_" } finally { # 清理会话 if ($session) { Remove-PSSession $session -ErrorAction SilentlyContinue } } } }
调试排查建议
- 安装失败时可到目标设备
C:\Windows\Logs\CBS目录查看CBS日志,确认系统更新层面的报错原因 - 可在安装脚本参数后添加
*>> C:\Temp\wmf_install.log将安装全程输出写入本地日志,远程调用失败后可直接读取该日志排查问题 - 确认目标Win7设备已提前安装.NET Framework 4.5以上版本,这是WMF 5.1的强制前置依赖,缺失会导致无提示安装失败
- 如果不需要安装后自动重启,删除参数中的
-AllowRestart即可,后续可统一批量重启设备生效
内容的提问来源于stack exchange,提问作者Furbs
相关产品推荐
相关产品推荐

