You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改点

  1. 去掉了单独收集$ID数组的步骤,直接遍历CSV的每一行,每一行对应一台计算机
  2. 在ForEach-Object内部,把当前计算机的ID存到$currentComputerID变量里
  3. 自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:58:10