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

PowerShell ForEach循环获取多服务器C盘信息重复返回本地数据问题

问题分析与解决:PowerShell远程获取服务器C盘存储信息失败

问题根源

你的代码每次返回相同数据,核心原因是Get-Volume默认仅在本地机器执行,循环中的$Server变量完全没被使用——不管循环多少次,都是读取当前运行脚本的电脑的C盘信息。

修正方案

下面提供两种常用的远程获取方式,根据你的环境选择:

方法1:使用Invoke-Command(需开启PSRemoting)

这种方法适合已配置PowerShell远程管理的环境,执行效率高:

$Servers = Get-Content -Path "C:\temp\serverlist.txt"

foreach ($Server in $Servers) {
    Invoke-Command -ComputerName $Server -ScriptBlock {
        Get-Volume -DriveLetter C | Select-Object `
            @{Name='ServerName';Expression={$env:COMPUTERNAME}},
            DriveLetter,
            @{Name='SizeRemaining(GB)';Expression={[math]::Round($_.SizeRemaining/1GB,2)}},
            @{Name='TotalSize(GB)';Expression={[math]::Round($_.Size/1GB,2)}}
    } | Format-Table -AutoSize
}
  • Invoke-Command会将脚本块发送到远程服务器执行,确保获取的是目标服务器的磁盘信息
  • 添加ServerName列,方便区分不同服务器的结果
  • 转换容量为GB单位,结果更直观

方法2:使用Get-CimInstance(依赖WMI,无需PSRemoting)

如果目标服务器未开启PSRemoting,可通过WMI查询:

$Servers = Get-Content -Path "C:\temp\serverlist.txt"

foreach ($Server in $Servers) {
    Get-CimInstance -ComputerName $Server -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'" |
        Select-Object `
            @{Name='ServerName';Expression={$_.PSComputerName}},
            DeviceID,
            @{Name='SizeRemaining(GB)';Expression={[math]::Round($_.FreeSpace/1GB,2)}},
            @{Name='TotalSize(GB)';Expression={[math]::Round($_.Size/1GB,2)}} |
        Format-Table -AutoSize
}
  • Win32_LogicalDisk是WMI中用于查询磁盘信息的类,通过Filter指定C盘
  • PSComputerName自动返回目标服务器名称,无需额外配置

注意事项

  • 执行脚本的账号需要拥有目标服务器的管理员权限
  • 若使用Invoke-Command,需在目标服务器执行Enable-PSRemoting -Force(管理员权限)开启远程管理
  • 确保服务器列表中的名称/IP可正常访问,防火墙允许WinRM(5985/5986端口)或WMI(135端口)通信

内容的提问来源于stack exchange,提问作者jesse holden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:07:27