Forum Discussion
brandonmc909
Sep 16, 2023Copper Contributor
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.
- RobinaIron Contributor
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 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: Set variables in scripts - Azure Pipelines | Microsoft Learn- perspolisCopper 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_MoravejCopper 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.
- RobinaIron ContributorIf 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.