PowerShell脚本求助:Windows更新后重启前10分钟提示无法实现
解决Windows更新重启前10分钟弹窗失效问题
问题根源分析
当前脚本的弹窗失效主要有三个核心原因:
- SYSTEM账户无法显示UI:任务计划用
/ru SYSTEM运行时,默认在后台会话执行,无法在当前登录用户的桌面显示弹窗。 - 时间格式缺失日期:仅用
HH:mm指定任务执行时间,若当前时间加延迟后跨天,任务会在当天已过的时间点执行,直接失效。 - 路径转义冗余:对脚本路径的空格转义操作不必要,反而可能导致任务无法正确识别路径。
修复方案及修改后的代码
以下是优化后的完整代码,解决上述所有问题:
function Show-BalloonTip { param ( [string]$Title, [string]$Message ) $notification = New-Object -ComObject WScript.Shell $notification.Popup($Message, 10, $Title, 0x1) } function Schedule-Tasks { # 定义延迟时间:24小时后重启,提前10分钟弹窗 $RebootDelayMinutes = 24 * 60 $WarningDelayMinutes = $RebootDelayMinutes - 10 # 计算完整的执行日期时间(包含年月日时分秒) $rebootTime = (Get-Date).AddMinutes($RebootDelayMinutes).ToString("yyyy-MM-dd HH:mm:ss") $warningTime = (Get-Date).AddMinutes($WarningDelayMinutes).ToString("yyyy-MM-dd HH:mm:ss") # 获取当前登录用户的用户名(用于任务计划在用户会话中执行) $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name # 创建重启任务(保留SYSTEM账户,重启无需UI) schtasks /create /tn "ScheduledReboot" /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command `"shutdown /r /f`"" /sc once /st $rebootTime.Split(' ')[1] /sd $rebootTime.Split(' ')[0] /ru SYSTEM /f # 创建弹窗脚本(使用WScript.Shell更兼容,避免PresentationFramework加载问题) $scriptPath = "C:\ProgramData\RebootWarning.ps1" $scriptContent = @" `$notification = New-Object -ComObject WScript.Shell `$notification.Popup('系统将在10分钟后重启,请保存当前工作。', 0, '重启警告', 0x4000 + 0x1) "@ Set-Content -Path $scriptPath -Value $scriptContent -Encoding UTF8 # 创建弹窗任务:使用当前用户,启用交互式会话确保弹窗显示 schtasks /create /tn "RebootWarning" /tr "powershell.exe -ExecutionPolicy Bypass -File `"$scriptPath`"" /sc once /st $warningTime.Split(' ')[1] /sd $warningTime.Split(' ')[0] /ru "$currentUser" /it /f } if (!$ListOnly -and !$NoAutoReboot) { Schedule-Tasks Show-BalloonTip -Title "Windows更新" -Message "更新已安装完成,系统将在24小时后重启。重启前10分钟会再次弹出提示。" }
关键修改说明
- 时间格式修正:使用
yyyy-MM-dd HH:mm:ss完整格式,通过/sd指定日期、/st指定时间,确保跨天任务能正确执行。 - 弹窗任务用户上下文:用当前登录用户替代SYSTEM,加上
/it参数启用交互式会话,保证弹窗能显示在用户桌面。 - 弹窗方式优化:改用
WScript.Shell.Popup替代PresentationFramework.MessageBox,避免.NET程序集加载权限问题,同时设置弹窗为置顶样式(0x4000 + 0x1)确保用户能看到。 - 执行策略兼容:添加
-ExecutionPolicy Bypass参数,避免PowerShell执行策略阻止脚本运行。
内容的提问来源于stack exchange,提问作者André Tavares
相关产品推荐
相关产品推荐

