В дополнение к полезный ответ Марша :
${...}
(включая имя переменной в {
и }
) действительно всегда необходимо, если имя переменной содержит специальные символы (например, пробелы или .
)
В контексте расширение строки (интерполяция) внутри "..."
, имеется другая причина использовать ${...}
, даже если само имя переменной не нужно:
Если вам нужно , чтобы разграничить имя переменной от следующих непосредственно непробельные символы , в том числе :
:
$foo = 'bar' # example variable
# INCORRECT: PowerShell assumes that the variable name is 'foobarian', not 'foo'
PS> "A $foobarian."
A . # Variable $foobarian doesn't exist -> reference expanded to empty string.
# CORRECT: Use {...} to delineate the variable name:
PS> "A ${foo}barian."
A barbarian.
# INCORRECT: PowerShell assumes that 'foo:' is a *namespace* (drive) reference
# (such as 'env:' in $env:PATH) and FAILS:
PS> "$foo: bar"
Variable reference is not valid. ':' was not followed by a valid variable name character.
Consider using ${} to delimit the name.
# CORRECT: Use {...} to delineate the variable name:
PS> "${foo}: bar"
bar: bar
См. этот ответ для подробного обзора правил расширения строк PowerShell.
Примечание что вам нужен тот же метод, когда расширение строки применяется неявно в контексте передачи аргумента без кавычек в команду ; например:
# INCORRECT: The argument is treated as if it were enclosed in "...",
# so the same rules apply.
Write-Output $foo:/bar
# CORRECT
Write-Output ${foo}:/bar
Наконец, несколько неясная альтернатива - `
- экранирование первого символа после имени переменной, но проблема в том, что это работает только так, как ожидается с символами, которые не являются ' t часть escape-последовательностей (см. about_Special_Characters
):
# OK: because `: is not an escape sequence.
PS> "$foo`: bar"
bar: bar
# NOT OK, because `b is the escape sequence for a backspace character.
PS> "$foo`bar"
baar # The `b seemingly "ate" the trailing 'r' of the variable value.