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

如何在PowerShell 5.1中将JSON数组的键值对设置为变量

问题描述

我有一个包含数组的JSON文件,希望将其中的每个键值对对应设置为PowerShell变量。

示例JSON

{
  "rel": "true",
  "test": "true",
  "artifact": "protfolio",
  "build": [
    {
      "appkey": "azure",
      "build_language": "dotnet",
      "script": "",
      "file": "",
      "test_script": ""
    },
    {
      "appkey": "npm",
      "build_language": "dotnet",
      "script": "",
      "file": "",
      "test_script": ""
    }
  ]
}

期望的变量格式

Name                            Value
$rel                            true
$test                           true
$artifact                       portfolio
$build_appkey_azure             azure
$build_buildlanguage_azure      dotnet
$build_script_azure
$build_file_azure
$build_testscript_azure 
$build_appkey_npm               npm
$build_buildlanguage_npm        dotnet
$build_script_npm
$build_file_npm
$build_testscript_npm

我已经能成功设置非数组元素对应的变量,但不知道怎么按上述格式处理数组部分,求帮助。

我的现有代码

$json_path =  Get-ChildItem "test.json" -recurse  | %{$_.FullName}
$json = Get-Content  $json_path -Raw | ConvertFrom-Json
$json.psobject.properties| Foreach { $hashtable[$_.Name] = $_.Value }
#echo $hashtable

$hashtable.GetEnumerator() | Sort key | ForEach-Object {

    $jsonKey = $_.Key
    $jsonValue = $_.Value
    $Basetype = $jsonValue.GetType() | Select-Object BaseType
    if ( $Basetype.BaseType.Name -eq "Array") {
        $val = $hashtable.Get_Item($jsonKey)
        #echo $val
        echo $val.appkey 
        echo $val.build_language

        #New-Variable -name $($val.name) -value $($val.value) -Force
    }
    else{
        New-Variable -name $jsonKey -value $jsonValue -Force
    }
}

解决方案

要处理数组部分的变量生成,核心是遍历数组中的每个对象,用数组键名 + 处理后的对象属性名 + 对象的appkey值作为变量名(属性名需去掉下划线),最后创建对应的变量。

修改后的完整代码如下:

# 初始化哈希表
$hashtable = @{}

# 读取并解析JSON文件
$json_path = Get-ChildItem "test.json" -Recurse | Select-Object -ExpandProperty FullName
$json = Get-Content $json_path -Raw | ConvertFrom-Json

# 将JSON属性存入哈希表
$json.psobject.Properties | ForEach-Object {
    $hashtable[$_.Name] = $_.Value
}

# 遍历哈希表生成变量
$hashtable.GetEnumerator() | Sort-Object Key | ForEach-Object {
    $jsonKey = $_.Key
    $jsonValue = $_.Value

    # 判断当前值是否为数组
    if ($jsonValue -is [array]) {
        # 遍历数组中的每个对象
        foreach ($item in $jsonValue) {
            $appKeySuffix = $item.appkey
            # 遍历对象的所有属性
            $item.psobject.Properties | ForEach-Object {
                $propName = $_.Name
                $propValue = $_.Value

                # 去掉属性名中的下划线
                $cleanPropName = $propName -replace '_', ''
                # 拼接变量名:数组键名_处理后的属性名_appkey后缀
                $varName = "${jsonKey}_${cleanPropName}_${appKeySuffix}"

                # 创建变量,空值也正常生成
                New-Variable -Name $varName -Value $propValue -Force
            }
        }
    }
    else {
        # 非数组类型直接创建变量
        New-Variable -Name $jsonKey -Value $jsonValue -Force
    }
}

代码说明

  1. 数组判断优化:用$jsonValue -is [array]替代GetType的方式,更简洁准确。
  2. 数组对象遍历:对数组中的每个对象,提取appkey作为变量名的唯一后缀,避免变量名冲突。
  3. 属性名处理:通过-replace '_', ''去掉属性名里的下划线,符合期望的build_language转buildlanguage格式。
  4. 变量名拼接:严格按照数组键名_处理后的属性名_appkey规则生成变量名,确保格式统一。
  5. 空值处理:即使属性值为空,也会正常创建对应的变量,完全匹配你的预期格式。

运行这段代码后,就能得到你需要的所有PowerShell变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:57:59