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

PowerShell中Select-Object展开多属性导出CSV报错求助

问题:PowerShell导出嵌套JSON API响应到CSV时出错

问题代码

尝试调用REST API后导出CSV的PowerShell代码:

$response = Invoke-RestMethod 'http://api.ipstack.com/54.251.51.24?access_key=mykey&security=1&hostname=1' -Method 'GET' -Headers $headers |
    Select-Object ip,hostname -ExpandProperty time_zone |
    Select-Object ip,hostname,@{N='time_zone_code';E={$_.code}} -ExpandProperty location |
    Select-Object ip,hostname,time_zone_code,@{N='location_geoname_id';E={$_.geoname_id}} -ExpandProperty languages |
    Select-Object ip,hostname,location_geoname_id,time_zone_code,@{N='languages_native';E={$_.native}} |
        Export-Csv C:\Users\Lenovo\Desktop\Danial\response.csv -NoTypeInformation -Append

错误信息

执行后抛出的错误:

Select-Object : Property "location" cannot be found.
At line:3 char:9
+         Select-Object ip,hostname,@{N='time_zone_code';E={$_.code}} - ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (@{id=Australia/...e=1.132.104.84}:PSObject) 
[Select-Object], PSArgumentException
    + FullyQualifiedErrorId : 
ExpandPropertyNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand

API响应结构

返回的JSON结构如下:

{
    "ip": "54.251.51.24",
    "hostname": "54.251.51.24",
    "type": "ipv4",
    "continent_code": "OC",
    "continent_name": "Oceania",
    "country_code": "AU",
    "country_name": "Australia",
    "region_code": "QLD",
    "region_name": "Queensland",
    "city": "Brisbane",
    "zip": "4000",
    "latitude": -27.467580795288086,
    "longitude": 153.02789306640625,
    "location": {
        "geoname_id": 2174003,
        "capital": "Canberra",
        "languages": [
            {
                "code": "en",
                "name": "English",
                "native": "English"
            }
        ],
        "country_flag": "https://assets.ipstack.com/flags/au.svg",
        "country_flag_emoji": "🇦🇺",
        "country_flag_emoji_unicode": "U+1F1E6 U+1F1FA",
        "calling_code": "61",
        "is_eu": false
    },
    "time_zone": {
        "id": "Australia/Brisbane",
        "current_time": "2023-03-07T18:54:34+10:00",
        "gmt_offset": 36000,
        "code": "AEST",
        "is_daylight_saving": false
    }
}

解决方案

错误原因

多次使用Select-Object -ExpandProperty会丢弃原对象的其他属性:第一次展开time_zone后,原对象的location属性已不存在,导致后续步骤找不到该属性。

正确代码

直接通过计算属性提取所有嵌套字段,无需多次展开:

$response = Invoke-RestMethod 'http://api.ipstack.com/54.251.51.24?access_key=mykey&security=1&hostname=1' -Method 'GET' -Headers $headers |
    Select-Object `
        # 顶层属性
        ip, hostname, type, continent_code, continent_name,
        country_code, country_name, region_code, region_name,
        city, zip, latitude, longitude,
        # time_zone嵌套属性(重命名避免冲突)
        @{Name='time_zone_id'; Expression={$_.time_zone.id}},
        @{Name='time_zone_current_time'; Expression={$_.time_zone.current_time}},
        @{Name='time_zone_gmt_offset'; Expression={$_.time_zone.gmt_offset}},
        @{Name='time_zone_code'; Expression={$_.time_zone.code}},
        @{Name='time_zone_is_daylight_saving'; Expression={$_.time_zone.is_daylight_saving}},
        # location嵌套属性
        @{Name='location_geoname_id'; Expression={$_.location.geoname_id}},
        @{Name='location_capital'; Expression={$_.location.capital}},
        @{Name='location_calling_code'; Expression={$_.location.calling_code}},
        @{Name='location_is_eu'; Expression={$_.location.is_eu}},
        @{Name='location_country_flag'; Expression={$_.location.country_flag}},
        @{Name='location_country_flag_emoji'; Expression={$_.location.country_flag_emoji}},
        @{Name='location_country_flag_emoji_unicode'; Expression={$_.location.country_flag_emoji_unicode}},
        # 处理languages数组(拼接为字符串避免System.Object[])
        @{Name='languages_native'; Expression={$_.location.languages.native -join ', '}} |
    Export-Csv C:\Users\Lenovo\Desktop\Danial\response.csv -NoTypeInformation -Append

关键说明

  1. 用@{Name='新列名'; Expression={$_.嵌套路径}}直接提取嵌套属性,保留原对象所有层级的信息
  2. 对于数组类型的字段(如languages),用-join ', '将数组元素拼接为字符串,确保CSV中显示可读内容而非System.Object[]
  3. 避免多次使用-ExpandProperty,防止丢失原对象的其他属性

内容的提问来源于stack exchange,提问作者Divyesh Jesadiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:10:10