在PowerShell 5.1中提取JSON内的AP名称及指定BSSID信息
PowerShell 5.1 JSON解析与指定数据提取解决方案
需求说明
- 运行环境:PowerShell 5.1
- 数据源:网络团队提供的JSON格式AP配置文件
- 提取目标:
- AP名称
- 仅
wifitrusted、wifiguest两个ESSID对应的macaddr值
- 输出要求:将结果导出为CSV文件
示例JSON数据
{ "aps": [ { "ap_name": "AP-Floor1-01", "ssids": [ { "essid": "wifitrusted", "macaddr": "aa:bb:cc:dd:ee:01" }, { "essid": "wifiguest", "macaddr": "aa:bb:cc:dd:ee:02" }, { "essid": "wifimanagement", "macaddr": "aa:bb:cc:dd:ee:03" } ] }, { "ap_name": "AP-Floor1-02", "ssids": [ { "essid": "wifitrusted", "macaddr": "aa:bb:cc:dd:ee:04" }, { "essid": "wifimanagement", "macaddr": "aa:bb:cc:dd:ee:05" } ] } ] }
现有代码片段
# 已实现的AP名称提取函数 function GetName { param( [Parameter(Mandatory=$true)] $JsonInput ) return $JsonInput.aps.ap_name } # 未完成的ESSID对应MAC提取函数 function GetEssid { param( [Parameter(Mandatory=$true)] $JsonInput ) # 待补充逻辑:提取指定ESSID的macaddr } # 现有执行流程 $jsonContent = Get-Content -Path "ap_data.json" -Raw | ConvertFrom-Json $apNames = GetName -JsonInput $jsonContent # 无法正确获取目标macaddr
期望CSV输出格式
APName,TrustedMAC,GuestMAC AP-Floor1-01,aa:bb:cc:dd:ee:01,aa:bb:cc:dd:ee:02 AP-Floor1-02,aa:bb:cc:dd:ee:04,
完整解决方案
方案1:简化版脚本(无需单独函数)
# 替换为你的JSON文件路径 $jsonFilePath = "ap_data.json" # 替换为你的CSV输出路径 $csvOutputPath = "ap_mac_export.csv" # 加载并解析JSON $apData = Get-Content -Path $jsonFilePath -Raw | ConvertFrom-Json # 遍历每个AP节点,提取目标数据 $outputRecords = foreach ($ap in $apData.aps) { # 提取指定ESSID的MAC地址,不存在则返回空值 $trustedMac = ($ap.ssids | Where-Object { $_.essid -eq "wifitrusted" }).macaddr $guestMac = ($ap.ssids | Where-Object { $_.essid -eq "wifiguest" }).macaddr # 构建结构化输出对象 [PSCustomObject]@{ APName = $ap.ap_name TrustedMAC = $trustedMac GuestMAC = $guestMac } } # 导出为CSV(-NoTypeInformation避免添加PowerShell类型头) $outputRecords | Export-Csv -Path $csvOutputPath -NoTypeInformation -Encoding UTF8
方案2:保留函数式实现(优化GetEssid)
function GetName { param( [Parameter(Mandatory=$true)] $JsonInput ) return $JsonInput.aps.ap_name } function GetEssid { param( [Parameter(Mandatory=$true)] $ApObject, [Parameter(Mandatory=$true)] [string]$TargetEssid ) # 筛选指定ESSID对应的MAC地址,不存在则返回空值 return ($ApObject.ssids | Where-Object { $_.essid -eq $TargetEssid }).macaddr } # 执行流程 $jsonFilePath = "ap_data.json" $csvOutputPath = "ap_mac_export.csv" $apData = Get-Content -Path $jsonFilePath -Raw | ConvertFrom-Json $outputRecords = foreach ($ap in $apData.aps) { [PSCustomObject]@{ APName = $ap.ap_name TrustedMAC = GetEssid -ApObject $ap -TargetEssid "wifitrusted" GuestMAC = GetEssid -ApObject $ap -TargetEssid "wifiguest" } } $outputRecords | Export-Csv -Path $csvOutputPath -NoTypeInformation -Encoding UTF8
关键逻辑说明
- JSON解析:
ConvertFrom-Json将JSON字符串转为PowerShell对象,可直接通过点语法(如$apData.aps、$ap.ap_name)访问属性 - 数据筛选:用
Where-Object过滤指定ESSID的节点,提取对应的macaddr值,若节点不存在则返回$null(CSV中显示为空) - 结构化输出:通过
[PSCustomObject]定义输出列名,确保CSV格式符合预期 - CSV导出:
-NoTypeInformation参数避免在CSV头部添加PowerShell类型注释,-Encoding UTF8保证中文兼容(若有)
内容的提问来源于stack exchange,提问作者joe williams III
相关产品推荐
相关产品推荐

