Yaml流水线Powershell内联脚本传参方法及执行报错求助
YAML管道内联脚本传参教程及报错解决方案
一、内联脚本传参方法(通俗版)
内联脚本传参比调用外部.ps1脚本简单很多,不需要写param块接收参数,直接用$(管道变量名)的格式就能拿到定义好的管道变量值,不管是自定义变量、系统预定义变量还是上游步骤输出的变量都适用。
下面是两个常见任务的示例:
示例1:PowerShell任务内联脚本传参
# 管道级自定义变量 variables: deployEnv: prod operator: lisi - task: PowerShell@2 inputs: targetType: 'inline' script: | # 直接取值使用 Write-Host "当前部署环境:$(deployEnv)" Write-Host "操作人:$(operator)" # 也可以赋值给PowerShell本地变量后续使用 $localEnv = "$(deployEnv)" if ($localEnv -eq "prod") { Write-Host "生产环境操作需谨慎" }
示例2:Azure CLI任务内联脚本传参
如果Azure CLI任务选择ps类型的脚本,传参规则和上面完全一致:
variables: rgName: my-demo-rg vnetName: my-demo-vnet - task: AzureCLI@2 inputs: azureSubscription: '你的Azure服务连接名称' scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | Write-Host "当前操作资源组:$(rgName),虚拟网络名称:$(vnetName)" # 变量直接代入Azure CLI命令使用 $subnetList = az network vnet subnet list -g $(rgName) --vnet-name $(vnetName) -o tsv Write-Host "子网列表:$subnetList"
上游步骤输出变量传参
如果要使用前面步骤输出的变量,先给输出变量的步骤设置名称,再用$(步骤名.变量名)取值即可:
# 第一步输出变量 - task: PowerShell@2 name: getResStep inputs: targetType: 'inline' script: | $nsgId = "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Network/networkSecurityGroups/my-nsg" # 输出变量到管道 Write-Host "##vso[task.setvariable variable=nsgId;isOutput=true]$nsgId" # 后续步骤使用变量 - task: AzureCLI@2 inputs: azureSubscription: '你的Azure服务连接名称' scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | Write-Host "前一步获取的NSG ID:$(getResStep.nsgId)"
二、--ids: expected at least one argument报错解决方案
报错原因
你遇到的报错有两个核心问题:
- YAML内联脚本里不能用HTML转义字符
"表示双引号,要直接写" - 你查询旧NSG关联子网的命令返回了空值,导致
$oldnsgid为空,传给--ids时没有有效值就抛出了这个错误
修正后的代码
- task: AzureCLI@2 inputs: azureSubscription: 'JMeterAzureConnection' scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | # 查询旧NSG关联的子网ID $oldnsgid = az network nsg show -n armmc-nsg -g arm-armmcdemo-rg --query 'subnets[].id' -o tsv # 加空值判断避免报错 if ([string]::IsNullOrEmpty($oldnsgid)) { Write-Host "未查询到armmc-nsg关联的子网,请检查NSG名称、资源组是否正确,确认NSG是否已绑定子网" exit 0 } # 直接使用双引号,不需要转义 az network vnet subnet update --ids $oldnsgid --network-security-group "armmc-nsgv1"
额外排查建议
如果修改后仍有问题,可以在查询$oldnsgid后加一行Write-Host "查询到的子网ID:$oldnsgid",运行管道查看输出的值是否符合预期,大部分空值问题都是NSG名称、资源组拼写错误,或者对应NSG本身没有绑定任何子网导致的。
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

