# Note the (...) around the assignment.
Write-Host "##[debug]Output file is $( ($SqlFileDest="C:\Temp\SomeFile.bak") )"
That is, embed the variable assignment in an expandable string ("..."
) via $(...)
, the subexpression operator, and **enclose the assignment in (...)
so as to pass its value through**.
Note that, unlike $(...)
in Bash, for instance, PowerShell's $(...)
runs in-process, directly in the caller's scope, so that variable $SqlFileDest
is visible to subsequent code.
A pipeline-based alternative requires use of ForEach-Object
with a script block ({ ... }
), so that the automatic $_
variable is meaningfully defined:
# Note the (...) around the assignment.
($SqlFileDest = "C:\Temp\SomeFile.bak") |
ForEach-Object { Write-Host "##[debug]Output file is $_" }
An alternative is to use the (rarely necessary) Write-Output
cmdlet with the common -OutVariable
parameter parameter:
# Note the use of -OutVariable, and that the target var. is NOT $-prefixed
Write-Output "C:\Temp\SomeFile.bak" -OutVariable SqlFileDest |
ForEach-Object { Write-Host "##[debug]Output file is $_" }
A small caveat is that the target variable, $SqlFileDest
will be System.Collections.ArrayList
-typed, i.e., be an array-like data structure with a single element containing the output string in this case, because -OutVariable
always returns the captured output this way - see GitHub issue #3154 for a discussion.
As for what you tried:
$SqlFileDest = "C:\Temp\SomeFile.bak" | Write-Host "##[debug]Output file is $($_)"
Leaving the problem with use of $_
outside a script block aside, this assigns the entire pipeline's output to $SQlFileDest
.
Since Write-Host
produces no pipeline input, $a
will be $null
. See this answer for more information.
A note re Azure and diagnostic/debug output:
Write-Host
is used here to produce specially formatted stdout output for Azure in this case, which calls via PowerShell's CLI, where Write-Host
output becomes stdout output too.
- While
Write-Output
- or simply implicit output of strings - is the better choice, using Write-Host
is very commonly found online, including in the documentation.
If you generally want to produce diagnostic / debugging output in PowerShell, you can pipe to Write-Verbose
or Write-Debug
, which target the verbose and debug output streams respectively, which obviates the need for ForEach-Object
if you supply the message via a delay-bind script block,[1] as zett42 points out; e.g.:
# Note:
# * -Verbose produces verbose output *unconditionally*
# If you omit it, the $VerbosePreference preference var. controls the behavior.
# By default, there is *no* output.
# The same applies analogously to -Debug / $DebugPreference.
# * Note the use of { ... } - a delay-bind script block, which
# in turn requires targeting the -Message parameter explicitly.
($SqlFileDest = "C:\Temp\SomeFile.bak") |
Write-Verbose -Verbose -Message { "Output file is $_" }
[1] The reason this technique can not be used with Write-Host
is that its -Object
parameter (receiving the object(s) to write) is [object]
-typed, which precludes use of delay-bind script blocks. See this answer for details.