如何在Azure DevOps管道中将Json变量传递给命令行任务?

时间:2020-06-23 11:10:14

标签: azure azure-devops

我正在Powershell任务中填充管道变量,并且已成功填充它:

    $env:RESULTJSON=$json
Write-host "##vso[task.setvariable variable=testJSON]$json"

但是,当我尝试使用它在命令行任务中传递值时,我无法这样做:

    task: CmdLine@2 
    env:     
      InputJSON: $(testJSON)    
    inputs:      
    script:
        echo %INPUTJSON%        
        'jsonProcessor.exe $(Build.BuildID),%INPUTJSON%'    
    workingDirectory: './jsonProcExe/'

我在testJSON中只得到“ {”,而不是整个JSON值。

1 个答案:

答案 0 :(得分:0)

我无法获得resultJson的值。

1。如果resultJsonpipeline variable,则应使用InputJSON: $(resultJSON)而不是InputJSON: $($resultJSON)

假设管道变量resultJSON的值为100,那么管道中的所有任务都可以得到其值100。您可以使用Task$env:RESULTJSON=$json范围内修改其值,然后该变量的值就是该PS任务中$json的值。

但是请注意:其他任务将获得100,而不是$json的值。 (区分管道范围和任务范围之间的区别)

2。如果resultJson是PS任务中定义的变量,则其他任务无法访问其值,因为该变量仅在当前会话中有效。 (您可以添加第二个PS任务进行测试)

要在多个任务/步骤中定义变量,可以在PS任务中使用logging command,然后选中Set variables in scripts

更新1

logging命令不直接支持Json格式变量。因此,在定义变量之前,我们需要将其转换为一行:

$json=$json| ConvertTo-Json -Compress
Write-host "##vso[task.setvariable variable=testJSON]$json"

更新2

另一个方向是通过文件传递json数据。例如,第一个PS任务使用$JSON | Out-File Test.json将内容输出到Test.json文件。下一个PS任务使用$Input = Get-Content Test.jsonWrite-Host $Input显示该值。另外,第二个任务可以是cmd任务,它们的(PS任务,CMD任务)默认工作目录相同。