Синтаксис интерполяции строк PowerShell - PullRequest
2 голосов
/ 20 февраля 2020

Я всегда использовал следующий синтаксис, чтобы убедиться, что переменная была раскрыта в строке:

"my string with a $($variable)"

Недавно я столкнулся со следующим синтаксисом:

"my string with a ${variable}"

Они эквивалентны? Какая разница?

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

${variable} - это синтаксис для имен переменных, которые содержат специальные символы.

(См. about_Variables -> Имена переменных, которые содержат специальные символы )

Пример:

${var with spaces} = "value"
"var with spaces: ${var with spaces}"

Так что в вашем случае это в основном то же самое, что просто написать $variable

1 голос
/ 21 февраля 2020

В дополнение к полезный ответ Марша :

${...} (включая имя переменной в { и }) действительно всегда необходимо, если имя переменной содержит специальные символы (например, пробелы или .)

В контексте расширение строки (интерполяция) внутри "...", имеется другая причина использовать ${...}, даже если само имя переменной не нужно:

Если вам нужно , чтобы разграничить имя переменной от следующих непосредственно непробельные символы , в том числе ::

$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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...