'Powershell Formatting for a String
I have a string that I want to insert dynamically a variable. Ex;
$tag = '{"number" = "5", "application" = "test","color" = "blue", "class" = "Java"}'
I want to accomplish:
$mynumber= 2
$tag = '{"number" = "$($mynumber)", "application" = "test","color" = "blue", "class" = "Java"}'
What I want is to have the variable inserted on the string, But it is not going through. I guess the '' sets all as a string. Any recomendations on how should I approach this?
thanks!
powershell test and trial and error. Also Google.
Solution 1:[1]
To add to Mathias' helpful answer:
Mistakenly expecting string interpolation inside
'...'strings (as opposed to inside"...") has come up many times before, and questions such as yours are often closed as a duplicate of this post.However, your question is worth answering separately, because:
Your use case introduces a follow-up problem, namely that embedded
"characters cannot be used as-is inside"...".More generally, the linked post is in the context of argument-passing, where additional rules apply.
Note: Some links below are to the relevant sections of the conceptual about_Quoting_Rules help topic.
In PowerShell:
only
"..."strings (double-quoted, called expandable strings) perform string interpolation, i.e. expansion of variable values (e.g."... $var"and subexpressions (e.g.,"... $($var.Prop)")not
'...'strings (single-quoted, called verbatim strings), whose values are used verbatim (literally).
With "...", if the string value itself contains " chars.:
either escape them as
`"or""E.g., with
`"; note that while use of$(...), the subexpression operator never hurts (e.g.$($mynumber)), it isn't necessary with stand-alone variable references such as$mynumber:$mynumber= 2 $tag = "{`"number`" = `"$mynumber`", `"application`" = `"test`",`"color`" = `"blue`", `"class`" = `"Java`"}"See the conceptual about_Special_Characters help topic for info on escaping and escape sequences.
If you need to embed
'inside'...', use'', or use a (single-quoted) here-string (see next).
or use a double-quoted here-string instead (
@"<newline>...<newline>"@):- See Mathias' answer, but generally note the strict, multiline syntax of here-strings:
- Nothing (except whitespace) must follow the opening delimiter on the same line (
@"/@') - The closing delimiter (
"@/'@) must be at the very start of the line - not even whitespace may come before it.
- Nothing (except whitespace) must follow the opening delimiter on the same line (
- See Mathias' answer, but generally note the strict, multiline syntax of here-strings:
Related answers:
When passing strings as command arguments, they are situationally implicitly treated like expandable strings (i.e. as if they were
"..."-enclosed); e.g.Write-Output $HOME\projects- see this answer.
Alternatives to string interpolation:
Situationally, other approaches to constructing a string dynamically can be useful:
Use a (verbatim) template string with placeholders, with
-f, the format operator:$mynumber= 2 # {0} is the placeholder for the first RHS operand ({1} for the 2nd, ...) '"number" = "{0}", ...' -f $mynumber # -> "number" = "2", ...Use simple string concatenation with the
+operator:$mynumber= 2 '"number" = "' + $mynumber + '", ...' # -> "number" = "2", ...
Solution 2:[2]
The reason your current attempt doesn't work is that single-quoted (') string literals in PowerShell are verbatim strings - no attempt will be made at expanding subexpression pipelines or variable expressions.
If you want an expandable string literal without having to escape all the double-quotes (") contained in the string itself, use a here-string:
$mynumber = 2
$tag = @"
{"number" = "$($mynumber)", "application" = "test","color" = "blue", "class" = "Java"}
"@
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Mathias R. Jessen |
