如何通过PowerShell获取电脑首次系统安装日期及使用年限并导出为CSV/Excel文件
解决设备年限统计与导出需求的PowerShell方案
我帮你调整代码,既能准确获取首次系统安装日期,又能导出成CSV(Excel可直接打开)格式的报告。咱们一步步来优化:
核心问题分析
你当前的注册表查询会返回Windows升级的所有历史记录,所以需要从中筛选出最早的那条记录作为首次安装日期;另外,Get-WmiObject已经被微软标记为过时,推荐用更高效的Get-CimInstance替代。
完整优化代码
# 获取核心硬件信息 $computerName = $env:COMPUTERNAME $computerSystem = Get-CimInstance -Class Win32_ComputerSystem $manufacturer = $computerSystem.Manufacturer $model = $computerSystem.Model # 获取首次系统安装日期(从注册表筛选最早的记录) $osInstallRecords = @( Get-ChildItem -Path HKLM:\System\Setup\Source* | ForEach-Object { Get-ItemProperty -Path Registry::$_ }, Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' ) $firstInstallDate = ($osInstallRecords | Select-Object @{ Name = 'InstallDate' Expression = { [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($_.InstallDate)) } } | Sort-Object InstallDate | Select-Object -First 1).InstallDate # 计算基于首次安装日期的使用年限(保留两位小数更易读) $ageInYears = [math]::Round((New-TimeSpan -Start $firstInstallDate -End (Get-Date)).TotalDays / 365, 2) # 整理成标准化对象 $deviceReport = [PSCustomObject]@{ '电脑名称' = $computerName '制造商' = $manufacturer '型号' = $model '首次系统安装日期' = $firstInstallDate '使用年限(年)' = $ageInYears } # 输出到控制台预览 $deviceReport # 导出为CSV文件(Excel可直接打开,指定UTF8避免乱码) $deviceReport | Export-Csv -Path "C:\DeviceAgingReport.csv" -NoTypeInformation -Encoding UTF8
代码说明
- 硬件信息获取:用
Get-CimInstance替代Get-WmiObject,兼容性和性能更好,稳定获取电脑名称、制造商、型号。 - 首次安装日期筛选:从注册表的Windows升级记录中提取所有安装时间,排序后取第一条(最早的)作为首次安装日期,解决了之前多记录的问题。
- 年限计算:用
TotalDays替代Days计算更精确,加上[math]::Round保留两位小数,结果更直观易读。 - 导出CSV:
Export-Csv是PowerShell原生命令,生成的文件可以直接用Excel打开;-Encoding UTF8解决中文乱码问题,-NoTypeInformation去掉多余的类型头,让文件更简洁。
扩展说明
如果需要统计多台设备,可以把代码改成循环遍历设备列表的形式(需要目标设备开启WinRM):
$deviceList = @("WS0***MH", "PC001", "PC002") $allReports = foreach ($device in $deviceList) { $computerSystem = Get-CimInstance -Class Win32_ComputerSystem -ComputerName $device # 其余逻辑和单设备代码一致,注意远程注册表访问的权限配置 } $allReports | Export-Csv -Path "C:\AllDeviceAgingReport.csv" -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者Lucas




