PowerShell中提取JSON变量属性并展开变量至实际值的问题
解决PowerShell中JSON配置变量展开的问题
问题场景
通过JSON文件配置Excel生成规则,其中部分字段存储的是PowerShell变量名(而非硬编码值),需要将这些变量名替换为对应的实际值,包括文件路径和已导入的CSV对象:
- JSON中
File字段可能是硬编码路径,也可能是PowerShell变量名(如$DocTypesListCountCsv) - JSON中
Var字段对应运行时通过Import-Csv生成的变量(如$DocTypesList)
示例JSON配置
{ "ClientMatters_Count": { "Var": "$ClientMattersList", "File": "D:\\TFS\\ProjectND\\ImportExport\\Import\\Export\\ClientMattersListCount.csv" }, "DocTypes_Count": { "Var": "$DocTypesList", "File": "$DocTypesListCountCsv" } }
问题现象
读取JSON后直接获取字段值时,得到的是变量名字符串(如$DocTypesListCountCsv),而非实际路径;使用Get-Variable时因传入带$的变量名报错:
Get-Variable: Cannot find a variable with the name '$Nd_DocTypesListCountCsv'.
解决方案
核心思路:识别带$前缀的变量名字符串,去除$后通过Get-Variable获取对应变量的实际值。
步骤1:读取JSON配置
$ExcelConfig = Get-Content -Path "你的配置文件路径.json" | ConvertFrom-Json
步骤2:遍历并处理每个配置项
foreach ($configItem in $ExcelConfig.PSObject.Properties) { $sheetName = $configItem.Name $config = $configItem.Value # 处理File字段:展开变量为实际路径 $filePath = $config.File if ($filePath -match '^\$') { # 移除开头的$符号,得到纯变量名 $varName = $filePath.Substring(1) $filePath = Get-Variable -Name $varName -ValueOnly -ErrorAction Stop } # 处理Var字段:获取已导入的CSV对象 $csvData = $null $varRef = $config.Var if ($varRef -match '^\$') { $varName = $varRef.Substring(1) $csvData = Get-Variable -Name $varName -ValueOnly -ErrorAction Stop } # 调用Export-Excel生成表格 if ($csvData) { $csvData | Export-Excel -Path "输出Excel文件路径.xlsx" -WorksheetName $sheetName -AutoSize } }
关键说明
Get-Variable的-Name参数需要传入不带$符号的变量名,因此必须先移除字符串开头的$- 用
-ErrorAction Stop确保如果变量不存在时抛出错误,便于排查问题 - 若需处理更复杂的变量引用(如嵌套变量),可考虑使用
Invoke-Expression,但需注意安全风险(仅在可信配置文件中使用):# 仅用于可信场景 $filePath = Invoke-Expression "`"$($config.File)`""
内容的提问来源于stack exchange,提问作者Charles05663
相关产品推荐
相关产品推荐

