如何在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 } }
代码说明
- 数组判断优化:用
$jsonValue -is [array]替代GetType的方式,更简洁准确。 - 数组对象遍历:对数组中的每个对象,提取
appkey作为变量名的唯一后缀,避免变量名冲突。 - 属性名处理:通过
-replace '_', ''去掉属性名里的下划线,符合期望的build_language转buildlanguage格式。 - 变量名拼接:严格按照
数组键名_处理后的属性名_appkey规则生成变量名,确保格式统一。 - 空值处理:即使属性值为空,也会正常创建对应的变量,完全匹配你的预期格式。
运行这段代码后,就能得到你需要的所有PowerShell变量。
内容的提问来源于stack exchange,提问作者wehelpdox
相关产品推荐
相关产品推荐

