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.

  • Robina's avatar
    Robina
    Iron Contributor

    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.

      • 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
        Iron Contributor
        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