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
相关产品推荐
相关产品推荐

