如何在PowerShell中实现Windows注册表等待循环适配Intune部署
PowerShell等待注册表条件触发程序部署(Intune场景)
问题背景
在Intune环境中通过PowerShell部署程序时,使用常规的-Wait参数会导致进程挂起,因此需要实现一个等待循环:当注册表项HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{AA3C5F33-570B-3989-8542-D5DC0F759221}的DisplayVersion值等于21.1.21.45时,执行指定的安装程序。
原脚本问题分析
用户提供的脚本存在以下关键问题:
- 注册表路径未明确指定根键(默认读取当前用户注册表,访问本地机器注册表需显式声明)
Get-ItemProperty参数错误:误将目标版本值作为属性名传入,正确应指定属性名为DisplayVersion- 拼写错误:
Lenght应为Length,且判断逻辑错误,需对比属性值与目标版本是否一致 - 外部程序调用语法错误:使用
&调用时不能搭配-ArgumentList参数,需调整参数传递方式
修正后的脚本
# 目标注册表项路径(明确指定本地机器根键) $regPath = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{AA3C5F33-570B-3989-8542-D5DC0F759221}' # 需要匹配的DisplayVersion值 $targetVersion = '21.1.21.45' # 循环控制标志 $waitForCondition = $true # 最大等待次数(避免无限循环,可根据需求调整) $maxAttempts = 40 $currentAttempt = 0 do { $currentAttempt++ # 获取注册表项的DisplayVersion属性 $regProperty = Get-ItemProperty -Path $regPath -Name DisplayVersion -ErrorAction SilentlyContinue # 判断属性存在且值匹配目标版本 if ($regProperty -and $regProperty.DisplayVersion -eq $targetVersion) { # 执行安装程序,正确传递参数 Start-Process -FilePath "C:\Autodesk\{D138465E-4098-4F01-B453-1C4BEADE75D8}\image\installer.exe" ` -ArgumentList "-i deploy --offline_mode -o C:/Autodesk/{D138465E-4098-4F01-B453-1C4BEADE75D8}/image/Collection.xml --installer_version 1.35.0.9" ` -Wait -NoNewWindow $waitForCondition = $false Write-Host "满足条件,已执行安装程序" } else { # 未满足条件,等待15秒后重试 if ($currentAttempt -lt $maxAttempts) { Write-Host "未满足条件,15秒后重试(第$currentAttempt/$maxAttempts次)" Start-Sleep -Seconds 15 } else { # 达到最大重试次数,退出循环 Write-Host "达到最大重试次数,未满足条件,退出循环" $waitForCondition = $false } } } while ($waitForCondition)
关键说明
- 使用
Registry::前缀明确指定本地机器注册表路径,确保在系统上下文(Intune部署常用)下能正确读取 - 添加最大重试次数限制,避免脚本无限等待
- 使用
Start-Process搭配-Wait和-NoNewWindow参数,确保安装程序执行完成后再继续,同时避免弹出额外窗口 - 增加日志输出,便于排查部署过程中的问题
内容的提问来源于stack exchange,提问作者brendan smith
相关产品推荐
相关产品推荐

