PowerShell脚本整合磁盘容量代码及单条输出需求求助
解决思路与代码修改方案
首先咱们得明确:要实现单台机器一行数据,通常有两种常见需求,你可以根据实际场景选择:
- 只抓取**系统盘(C:)**的容量数据
- 汇总所有本地固定磁盘的总容量、总可用容量
下面针对这两种情况,一步步告诉你怎么把磁盘代码插入现有脚本,同时保证每行对应一台机器:
第一步:找到脚本中创建自定义对象的位置
你的现有脚本应该是在收集完各类基础信息后,会创建一个自定义对象(比如用[PSCustomObject]),再把这个对象导出到CSV。磁盘容量的代码就插在这个自定义对象的属性定义环节。
先补全你未贴完的脚本核心结构做参考:
# 输出文件位置可按需修改 $file="C:\scripts\reports\InentoryTest_$((Get-Date).ToString('MM-dd-yyyy')).csv" $txt="c:\scripts\reports\InentoryTest-error_$((Get-Date).ToString('MM-dd-yyyy')).txt" # 收集计算机基础信息 $computerName = $env:COMPUTERNAME $osInfo = Get-CimInstance Win32_OperatingSystem $cpuInfo = Get-CimInstance Win32_Processor # 这里就是要插入磁盘代码的核心位置!
第二步:添加磁盘容量代码(两种方案选其一)
方案1:只获取系统盘(C:)的容量数据
这种方案最简单,适合只关注系统盘使用情况的场景:
# 获取系统盘(C:)的容量信息 $systemDrive = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'" $totalSizeGB = [math]::Round($systemDrive.Size / 1GB, 2) $freeSpaceGB = [math]::Round($systemDrive.FreeSpace / 1GB, 2)
方案2:汇总所有本地固定磁盘的总容量/可用容量
如果需要统计所有本地硬盘的总和,用这个:
# 汇总所有本地固定磁盘的容量(DriveType=3代表本地固定磁盘) $localDisks = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" $totalSizeGB = [math]::Round(($localDisks | Measure-Object -Property Size -Sum).Sum / 1GB, 2) $freeSpaceGB = [math]::Round(($localDisks | Measure-Object -Property FreeSpace -Sum).Sum / 1GB, 2)
第三步:把磁盘数据加入导出对象
接下来,在创建自定义对象时,把刚才的磁盘属性加进去——这样每台机器只会生成一个对象,对应CSV里的一行数据:
# 创建包含磁盘信息的自定义对象 $inventoryObject = [PSCustomObject]@{ ComputerName = $computerName OSName = $osInfo.Caption CPUModel = $cpuInfo.Name TotalDiskSizeGB = $totalSizeGB # 新增磁盘总容量属性 FreeDiskSpaceGB = $freeSpaceGB # 新增磁盘可用容量属性 # 其他你原本要收集的属性... } # 导出到CSV(-Append适合多机器批量执行时追加数据) $inventoryObject | Export-Csv -Path $file -Append -NoTypeInformation -Encoding UTF8
第四步:可选但建议的错误处理
如果怕磁盘信息获取失败(比如权限问题),可以加个简单的错误捕获,把异常写到你的错误日志里:
try { # 把上面的磁盘获取代码放在try块里 $systemDrive = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'" -ErrorAction Stop $totalSizeGB = [math]::Round($systemDrive.Size / 1GB, 2) $freeSpaceGB = [math]::Round($systemDrive.FreeSpace / 1GB, 2) } catch { $errorMsg = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $computerName : 磁盘信息获取失败:$_" Add-Content -Path $txt -Value $errorMsg # 失败时给属性赋值默认值,避免CSV列缺失 $totalSizeGB = "获取失败" $freeSpaceGB = "获取失败" }
这样修改后,不管是单硬盘还是多硬盘系统,每台计算机都会在CSV里只输出一行,包含你需要的磁盘容量信息啦!
内容的提问来源于stack exchange,提问作者Gregory Motyka




