Windows 维护后是否已经重启:用 PowerShell 保存启动时间与运行时长

2026-10-31 / 0 评论 / 2 阅读

Windows 维护后是否已经重启:用 PowerShell 保存启动时间与运行时长 教程示意图

编写日期:2026-10-31。

适用场景

安装更新或完成维护后,你需要确认当前 Windows 系统的启动时间,并把结果保存为交接记录。只在终端里看一眼运行天数,过后很难说明那是何时采集的。本教程生成一份包含采集时刻、系统启动时刻、累计运行小时数和系统版本的 CSV 报告。

适用于 Windows 11 和常见 Windows Server 环境,可使用 Windows PowerShell 5.1 或 Windows 上的 PowerShell 7。操作限定在本机,不需要配置远程管理,也不会主动重启系统。

原理:启动时间是属性,报告是快照

Windows 的 Win32_OperatingSystem 类提供 LastBootUpTime 属性,表示操作系统最近一次重新启动的日期和时间。用采集时刻减去这个时间,可以得到对应的时间跨度。微软系统类文档

这里读取的是操作系统提供的时间属性。它不能单独证明某个补丁已经生效,也不能证明应用服务恢复正常。报告中的累计小时数只对应采集瞬间,保存后不会自动增长。将这些边界写清楚,比只交付一个“运行了多少天”的数字更有用。

准备工作

从开始菜单打开 Windows PowerShell,通常使用普通权限即可。先确认查询命令可用:

Get-Command Get-CimInstance
Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction Stop |
    Select-Object Caption, Version, LastBootUpTime

输出应包含系统名称、版本和可识别的时间。未指定远程计算机或会话时,该查询使用本机管理接口。Get-CimInstance 官方说明

如果提示访问被拒绝,先记录错误并检查本机管理策略,不要为完成报表而关闭安全功能。若启动时间为空,也应停止后续计算,避免把缺失数据变成看似正常的数字。

分步骤操作

第一步:读取一次数据并固定采集时刻

$os = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction Stop
$captured = Get-Date
$boot = $os.LastBootUpTime

if ($null -eq $boot) {
    throw '系统没有返回启动时间,停止生成报告。'
}
if ($boot -gt $captured) {
    throw '启动时间晚于采集时间,请先核对系统时间。'
}

后面所有字段都使用这次查询得到的对象,避免每计算一列又重新查询一次。先读取对象、随后记录采集时刻,也使两个时间的关系更容易理解。异常检查只用于阻止明显错误继续传播,不会自动校时。

第二步:组成结构清楚的报告对象

$report = [pscustomobject]@{
    CapturedAtUtc = $captured.ToUniversalTime().ToString('o')
    LastBootAtUtc = $boot.ToUniversalTime().ToString('o')
    UptimeHours = [math]::Round(($captured - $boot).TotalHours, 2)
    OperatingSystem = $os.Caption
    Version = $os.Version
}
$report | Format-List

前两列统一使用协调世界时,并保留标准时间格式,便于跨时区交接。UptimeHours 使用累计小时数,包含完整天数;不要用时间跨度对象中只表示一天内小时部分的属性代替。四舍五入到两位小数只是为了阅读方便,不应理解为测量具有同样精度。

第三步:保存为独立文件

$reportDir = Join-Path ([Environment]::GetFolderPath('UserProfile')) 'BootReports'
New-Item -ItemType Directory -Path $reportDir -Force -ErrorAction Stop | Out-Null
$stamp = Get-Date -Format 'yyyyMMdd-HHmmss-fff'
$reportPath = Join-Path $reportDir ('boot-report-' + $stamp + '.csv')
$report | Export-Csv -LiteralPath $reportPath -NoTypeInformation -Encoding UTF8 -NoClobber -ErrorAction Stop
$reportPath

BootReports 是当前用户配置目录下新建的报告文件夹,文件名中的时间由命令自动生成,无需手工填入路径。禁止覆盖选项可以避免同名文件被替换。保存时直接导出对象,不要把前面用于屏幕显示的格式化结果送入导出命令,否则可能得到格式控制信息。Export-Csv 官方文档

第四步:重新读取报告

$saved = Import-Csv -LiteralPath $reportPath
$saved | Format-List
@($saved).Count

应读回一条记录,五个字段都应存在。CSV 重新导入后通常是文本字段,后续计算前要明确转换类型,不要把文本直接当作实时系统对象。

验证方法

核对报告中的启动时间是否与第一步屏幕输出对应;显示形式不同,可以转换到相同时区后比较。累计运行小时数应为非负数,并与采集时刻和启动时刻之间的跨度大致一致。几分钟后重新执行完整流程,若期间没有重启,启动时间应保持一致,而新报告的累计小时数应增加。

若你本来就在已批准的重启维护窗口,可以分别保存重启前后的报告进行比较。不要为了验证教程而临时重启生产机器。确认系统启动时间后,仍需单独检查更新状态、关键服务以及业务访问结果。

常见错误

最常见的误读是把旧 CSV 当成当前状态,或者拿本地时间直接与 UTC 时间比较。还有人只看格式化后的天数,忽略不足一天的部分。若系统时间曾被大幅调整,单纯相减得到的跨度也需要结合维护记录解释。这里的启动时间不应直接等同于最近一次按电源键的时刻。

安全与回退

查询不会更改系统设置,新增内容只有报告目录和 CSV 文件。报告可能反映系统版本和维护节奏,应存放在合适的内部位置,分享前检查内容。回退时用文件管理器删除本次生成的报告即可;保留交接证据的机器应按既有保留周期处理,无需撤销任何系统配置。

参考资料与转载说明

本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。

评论一下?

OωO
取消