You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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分钟会再次弹出提示。"
}

关键修改说明

  1. 时间格式修正:使用yyyy-MM-dd HH:mm:ss完整格式,通过/sd指定日期、/st指定时间,确保跨天任务能正确执行。
  2. 弹窗任务用户上下文:用当前登录用户替代SYSTEM,加上/it参数启用交互式会话,保证弹窗能显示在用户桌面。
  3. 弹窗方式优化:改用WScript.Shell.Popup替代PresentationFramework.MessageBox,避免.NET程序集加载权限问题,同时设置弹窗为置顶样式(0x4000 + 0x1)确保用户能看到。
  4. 执行策略兼容:添加-ExecutionPolicy Bypass参数,避免PowerShell执行策略阻止脚本运行。

内容的提问来源于stack exchange,提问作者André Tavares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:55:19