求助:如何编写PowerShell脚本批量获取远程PC内存容量并导出CSV
批量获取远程计算机内存模块信息PowerShell脚本实现
现有脚本存在的问题
- 语法错误:
$Result += $Object语句放在了foreach循环外部,且存在大括号匹配错误,只会将最后一次遍历的结果存入结果集 - WMIC返回的是纯文本数组,无法直接作为
PSCustomObject的属性参数传入,该参数要求接收哈希表结构 - 无异常处理逻辑,遇到离线、权限不足的设备时会直接抛出错误,影响执行效率
推荐实现方案
使用PowerShell原生CIM cmdlet实现,相比WMIC返回结构化对象无需手动解析,稳定性更高:
# 初始化结果数组 $Result = @() # 读取计算机列表,自动跳过空行 $servers = Get-Content "L:\Data.txt" | Where-Object { $_ -notmatch '^\s*$' } Foreach ($s in $servers) { # 预检测设备可达性,优化批量执行速度 if (Test-Connection -ComputerName $s -Count 1 -Quiet -ErrorAction SilentlyContinue) { try { # 获取内存模块信息 $memoryChips = Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $s -ErrorAction Stop # 遍历每个内存模块生成单独记录 foreach ($chip in $memoryChips) { $Result += [PSCustomObject]@{ 计算机名 = $s 模块容量(字节) = $chip.Capacity 模块容量(GB) = [math]::Round($chip.Capacity / 1GB, 2) 插槽位置 = $chip.DeviceLocator 查询状态 = "成功" } } } catch { # 记录查询异常 $Result += [PSCustomObject]@{ 计算机名 = $s 模块容量(字节) = $null 模块容量(GB) = $null 插槽位置 = $null 查询状态 = "失败:$($_.Exception.Message)" } } } else { # 记录离线设备 $Result += [PSCustomObject]@{ 计算机名 = $s 模块容量(字节) = $null 模块容量(GB) = $null 插槽位置 = $null 查询状态 = "失败:设备不可达" } } } # 导出结果为CSV $Result | Export-Csv "L:\RAMReport.csv" -NoTypeInformation -Encoding UTF8
使用注意事项
- 执行脚本的账号需要拥有所有目标计算机的本地管理员权限
- 目标计算机需要开启WMI远程访问权限,防火墙放行WMI相关流量
- 1500台设备建议分批执行,避免网络拥堵影响查询成功率
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

