1. ホーム
  2. powershell

[解決済み] PowerShellの文字列補間構文

2022-03-04 02:42:36

質問

私はいつも以下の構文を使って、文字列の中で変数が展開されていることを確認していました。

"my string with a $($variable)"

最近、次のような構文に出くわした。

"my string with a ${variable}"

同等ですか?何か違いがありますか?

解決方法は?

補完するために marszeさんの回答 :

${...} (で変数名を囲む)。 {} ) は確かに 常に が含まれている場合、その変数名には 特殊文字 のような スペース . または - .

  • ない 特別なものは _ と - です。 驚くほど、問題なく - ? .
  • : 必ず を終了させると解釈されます。 ドライブ参照 のコンテキストでは 名前空間変数表記法 とは関係なく {...} の囲みが使用されているか、または必要である(例えば、次のような場合)。 $env:USERNAME または ${env:USERNAME} , env PowerShellドライブ すべての環境変数を表す)。

のコンテキストでは 文字列展開 (補間)内部 "..." がある場合、そこには 別の 理由 使用 ${...} たとえ変数名自体にそれが必要ないとしても。

が必要な場合 に続く空白以外の文字と変数名を区別するためです。 特に : :

$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


最後に、やや不明瞭な代替案として ` -の一部でない文字に対してのみ、期待通りに動作するという問題があります。 エスケープシーケンス (参照 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 "ate" the trailing 'r' of the variable value
     # and only "ar" was the literal part.