Powershell查询计算机硬盘介质类型导出CSV文件异常问题求助
问题描述
需要统计各台计算机配备的是HDD还是SSD,现有存储了计算机列表的csv文件,导入列表执行脚本后,导出的csv文件要么不存在要么数据不完整,需要指出脚本错误部分。
初始错误脚本
$computers = Import-csv -path "C:\Temp\MediaType\Computers.csv" foreach ($computer in $computers) { Write-Host "`nPulling Physical Drive(s) for $computer" if((Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer -Quiet)){ Invoke-Command -ComputerName $computer -ScriptBlock { Get-WmiObject -Class MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage | Select-Object sort -Property PSComputerName, Model, SerialNumber, MediaType Export-Csv C:\Temp\devices.csv } } }
原脚本错误点汇总
Export-Csv写在Invoke-Command的脚本块内部,会在远程被控计算机上执行导出操作,文件会生成在远程机器的C:\Temp路径下,而非你当前操作的本地机器,所以本地找不到导出文件- 语法错误:
Select-Object sort -Property写法错误,排序操作需要单独调用Sort-Object命令,不能直接将sort作为参数传给Select-Object,会导致查询结果输出异常 - 导出时没有加
-Append参数,每次执行Export-Csv都会直接覆盖原有文件,最终只会保留最后一台成功查询的设备数据,导致结果不完整 Test-Connection的-ComputerName参数直接传入$computer对象,没有指定CSV中存储设备名的对应字段(比如你最终脚本用到的$computer.computer),会导致网络连通性检测失败,大量在线设备被误判为离线- 使用已经过时的
Get-WmiObject接口,在新的Windows系统上兼容性较差,容易出现查询失败的问题,官方已经推荐替换为Get-CimInstance接口
修正后可用脚本
$ExportTo = "C:\Temp\devices.csv" $computers = Import-csv -path "C:\Temp\Computers.csv" {} | Select "ComputerName", "Status", "Model", "SerialNumber", "MediaType" | Export-Csv $ExportTo $data = Import-csv -path $ExportTo foreach ($computer in $computers) { $Online = Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer.computer -Quiet if ($Online) { Write-Host $computer.computer " is Online" $OutputMessage = Get-CimInstance -ClassName MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage -ComputerName $computer.computer | Select-Object -Property PSComputerName,@{N='Status';E={'Online'}}, Model, SerialNumber, MediaType $data.ComputerName = $computer.computer $data.Status = $OutputMessage.Status $data.Model = $OutputMessage.Model $data.SerialNumber = $OutputMessage.SerialNumber $data.MediaType = $OutputMessage.MediaType $data | Export-Csv -Path $ExportTo -Append -NoTypeInformation } else { Write-Host $computer.computer " is Offline" $data.ComputerName = $computer.computer $data.Status = "Offline" $data.Model = "" $data.SerialNumber = "" $data.MediaType = "" $data | Export-Csv -Path $ExportTo -Append -NoTypeInformation } }
内容的提问来源于stack exchange,提问作者MalcolmITGuy
相关产品推荐
相关产品推荐

