Forum Discussion
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?
- 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
- 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. - Preston2330Copper ContributorRobina 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- perspolisCopper ContributorPreston2330 
 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_MoravejCopper Contributorthis 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. - 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.
 
- brandonmc909Copper ContributorMakes sense. Thank you.