Forum Discussion

brandonmc909's avatar
brandonmc909
Copper Contributor
Sep 16, 2023
Solved

Passing a here-string as adhoc Output Variable

I would like to send a multiple line here-string as an output variable in my release pipeline. For whatever reason when I try to do this, it only returns the first line of text. 


For example (PowerShell):

$output = @'
This is some text that I want to send
to another task in my pipeline.
'@

Write-Host "##vso[task.setvariable variable=scriptOutputMsg;]$output"

This only returns as "This is some text that I want to send" in a downstream task. How do I get it to return text on additional lines?

  • brandonmc909 

    In Azure DevOps pipelines, when you set a variable using the `Write-Host` command as you've shown in your example, the variable is set to the value until the first newline character. To set a multi-line variable, you can use a different approach. You can use the `Write-Host` command with multiple `##vso[task.setvariable]` commands to set the variable line by line.

     

    Here's an example of how you can set a multi-line variable in PowerShell:

    $lines = @(
        "This is some text that I want to send",
        "to another task in my pipeline.",
        "This is another line of text."
    )
    
    foreach ($line in $lines) {
        Write-Host "##vso[task.setvariable variable=scriptOutputMsg;isOutput=true]$line"
    }

     

    This PowerShell script creates an array of lines and then iterates through the lines, setting the `scriptOutputMsg` variable one line at a time. The `isOutput=true` parameter is used to indicate that this is an output variable.

    In your downstream tasks, you can access this multi-line variable as `$(scriptOutputMsg)` and it will retain all the lines you've set in the loop.

9 Replies

  • brandonmc909 

    In Azure DevOps pipelines, when you set a variable using the `Write-Host` command as you've shown in your example, the variable is set to the value until the first newline character. To set a multi-line variable, you can use a different approach. You can use the `Write-Host` command with multiple `##vso[task.setvariable]` commands to set the variable line by line.

     

    Here's an example of how you can set a multi-line variable in PowerShell:

    $lines = @(
        "This is some text that I want to send",
        "to another task in my pipeline.",
        "This is another line of text."
    )
    
    foreach ($line in $lines) {
        Write-Host "##vso[task.setvariable variable=scriptOutputMsg;isOutput=true]$line"
    }

     

    This PowerShell script creates an array of lines and then iterates through the lines, setting the `scriptOutputMsg` variable one line at a time. The `isOutput=true` parameter is used to indicate that this is an output variable.

    In your downstream tasks, you can access this multi-line variable as `$(scriptOutputMsg)` and it will retain all the lines you've set in the loop.

    • Preston2330's avatar
      Preston2330
      Copper Contributor

      Robina This solution does not work. Calling set variable multiple times will overwrite the previous value. However, you can use percent encoding to convert new lines into "%0A". Once processed it will be converted back into a new line when the variable is set.


      This is briefly mentioned under this section: https://learn.microsoft.com/en-us/azure/devops/pipelines/process/set-variables-scripts?view=azure-devops&tabs=bash#set-an-output-variable-for-use-in-future-stages

      • perspolis's avatar
        perspolis
        Copper Contributor

        Preston2330 

        As Robina mentioned you need to replace the carriage return character with encoded new line character.

         
        $MultilineString=@"
        This is test
        for showing multi lines
        in Azure Devops pipeline
        "@
        $output=$MultilineString -replace "`n", "%0D%0A"

        You can pass the $output variable to the rest of pipeline

    • Mona_Moravej's avatar
      Mona_Moravej
      Copper Contributor

      this solution is not working, what happen is the values get replaced by whatever is the last line in the lines! so in example above $(scriptOutputMsg) contains "This is another line of text." only. I tried all the solution I could find online, none of them are working, so I believe there is no way to pass a string with newline in it.

      • Robina's avatar
        Robina
        MCT
        If you find that there is no direct way to pass a string with newline characters in Azure DevOps variables, you might need to adjust your pipeline scripting or consider alternative approaches based on the specific requirements of your use case.

Resources