PowerShell新手求助:从CSV读取计算机列表后,如何正确编写Select-Object中的ID自定义列表达式
PowerShell自定义列显示对应计算机ID的解决方案
嗨,刚看了你的脚本问题,核心问题出在你自定义ID列时引用了整个$ID数组,导致每个磁盘条目都输出所有计算机的ID,而不是它所属的那台机器的ID。
问题原因
你之前的代码先把所有CSV里的ID存到$ID数组,然后一次性对所有计算机执行Get-WmiObject,这时候在Select-Object的expression里用$ID,它会把整个数组的内容都塞到每一行里,自然不符合预期。
修正方案
我们需要逐台处理计算机,这样就能在处理每台机器的磁盘时,拿到对应的单个ID,而不是整个数组。修改后的脚本如下:
Import-Csv C:\computers2.csv | ForEach-Object { # 保存当前处理的计算机ID $currentComputerID = $_.ID # 针对当前计算机查询逻辑磁盘 Get-WmiObject -Class Win32_LogicalDisk -ComputerName $currentComputerID | Select-Object -Property DeviceID, @{Label='ID'; expression= {$currentComputerID}}, @{Label='Total (Gb)'; expression={($_.Size/1GB).ToString('F2')}}, @{Label='Free (Gb)'; expression={($_.FreeSpace/1GB).ToString('F2')}}, @{label='Percent'; expression={[Math]::Round(($_.freespace / $_.size) * 100, 2)}} } | Format-Table
关键修改点
- 去掉了单独收集
$ID数组的步骤,直接遍历CSV的每一行,每一行对应一台计算机 - 在
ForEach-Object内部,把当前计算机的ID存到$currentComputerID变量里 - 自定义
ID列的expression引用$currentComputerID,这样每一行磁盘信息都会关联到它所属的那台计算机ID
另外,如果你用的是PowerShell 5.1及以上,也可以考虑用Get-CimInstance替代Get-WmiObject(WMI cmdlet已经被CIM cmdlet取代,功能更完善),修改后的这部分代码是:
Get-CimInstance -Class Win32_LogicalDisk -ComputerName $currentComputerID
这样就能得到你想要的结果啦,每一行磁盘信息的ID列都会显示它所属的计算机ID。
内容的提问来源于stack exchange,提问作者mactattie
相关产品推荐
相关产品推荐

