编写日期: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 文件。报告可能反映系统版本和维护节奏,应存放在合适的内部位置,分享前检查内容。回退时用文件管理器删除本次生成的报告即可;保留交接证据的机器应按既有保留周期处理,无需撤销任何系统配置。
参考资料与转载说明
- Microsoft Learn:Win32_OperatingSystem 与 LastBootUpTime
- Microsoft Learn:Get-CimInstance
- Microsoft Learn:Export-Csv
本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。
评论一下?