Azure Pipelines中用PowerShell给JSON的MedID赋值报错求助
Azure Pipelines中修改存储账户下载的JSON字段问题解决方案
问题描述
在非内联Azure Pipelines环境下,需将变量值填入从存储账户下载的JSON文件中空的MedID字段(JSON包含MedUnits数组,其中MedID字段为空)。执行PowerShell脚本时遇到两类路径错误:
Get-Content : Illegal characters in path- 移除路径中的
.\后出现Get-Content : Cannot find drive. A drive with the name '{"MedUnits"' does not exist.
尝试的脚本片段:
#从存储账户下载文件 $unitsFile = Invoke-WebRequest -URI "https://storage.blob.core.windows.net/folder/${json}?sv=TOKEN" $JsonData = Get-Content -Path .\$unitsFile | ConvertFrom-Json $JsonData.update | % { if($JsonData.MedUnits.MedID){$JsonData.MedUnits.MedID= "$ID"}} $JsonData | ConvertTo-Json -Depth 4 | set-content $unitsFile
错误原因
Invoke-WebRequest返回的是HTTP响应对象,并非本地文件路径或文件名。直接将该对象传给Get-Content或Set-Content,会导致PowerShell把响应的JSON内容当成路径解析,进而触发非法字符或找不到驱动器的错误。
修正后的脚本
# 定义本地保存的文件名 $localFilePath = ".\med_units.json" # 从存储账户下载文件并保存到本地 Invoke-WebRequest -Uri "https://storage.blob.core.windows.net/folder/${json}?sv=TOKEN" -OutFile $localFilePath # 读取本地JSON文件并解析 $JsonData = Get-Content -Path $localFilePath | ConvertFrom-Json # 遍历MedUnits数组,为空的MedID赋值 foreach ($unit in $JsonData.MedUnits) { if (-not $unit.MedID) { # 判断MedID是否为空 $unit.MedID = "$ID" # 替换为目标变量值 } } # 将修改后的JSON写回本地文件 $JsonData | ConvertTo-Json -Depth 4 | Set-Content -Path $localFilePath
关键说明
- 先通过
-OutFile参数将下载内容保存到本地文件,确保后续操作的是合法文件路径 - 遍历
MedUnits数组时,需逐个处理数组内的元素,而非直接操作整个数组的MedID属性 - 使用
-not $unit.MedID判断字段是否为空,逻辑更准确(原脚本的if($JsonData.MedUnits.MedID)仅判断数组是否存在该属性,而非每个元素的字段是否为空)
内容的提问来源于stack exchange,提问作者GTGabaaron
相关产品推荐
相关产品推荐

