about_Quoting_Rules
簡短描述
描述在PowerShell中使用單引號和雙引號的規則。
詳細描述
剖析時,PowerShell 會先將輸入解譯為表達式。 但是當遇到命令調用時,剖析會繼續以自變數模式進行。 不含引號的非數值自變數會被視為字串。 如果您有包含空格的自變數,例如路徑,則必須以引號括住這些自變數值。 如需自變數剖析的詳細資訊,請參閱about_Parsing的自變數模式一節。
引號可用來指定常值字串。 您可以用單引號 ('
) 或雙引號 () 括住字串。"
引號也可用來建立 here-string。 here-string 是單引號或雙引號字串,其中引號會以字面方式解譯。 here-string 可以跨越多行。 此處字串中的所有行都會解譯為字串,即使它們並未以引號括住。
在遠端電腦的命令中,引號會定義在遠端電腦上執行的命令部分。 在遠端會話中,引號也會判斷命令中的變數會先在本機計算機上或遠端電腦上解譯。
注意
PowerShell 會將智慧引號視為字串的一般引號,也稱為印刷樣式或大括號。 請勿使用智慧引號來括住字串。 撰寫包含智慧引號的字串時,請遵循本檔的字串區段中的包含引號字元中的指引。 如需智慧引號的詳細資訊,請參閱維琪百科文章英文引號中的智慧引號一節。
雙引號字串
以雙引弧括住的 字串是可展開的 字串。 前面加上貨幣符號 ($
) 的變數名稱會取代為變數的值,然後再將字串傳遞至命令進行處理。
例如:
$i = 5
"The value of $i is $i."
這個指令輸出如下:
The value of 5 is 5.
此外,在雙引號字串中,會評估表達式,並將結果插入字串中。 例如:
"The value of $(2+3) is 5."
這個指令輸出如下:
The value of 5 is 5.
只有基本變數參考可以直接內嵌在可展開的字串中。 使用陣列索引或成員存取的變數參考必須包含在子表達式中。 例如:
"PS version: $($PSVersionTable.PSVersion)"
PS version: 5.1.22621.4111
若要分隔變數名稱與字串中的後續字元,請以大括號 ({}
) 括住它。 如果變數名稱後面接著冒號,這特別重要。:
PowerShell 會考慮 與 :
範圍規範之間的$
一切,通常會導致解譯失敗。 例如, "$HOME: where the heart is."
擲回錯誤,但 "${HOME}: where the heart is."
如預期般運作。
若要防止在雙引號字串中替代變數值,請使用反引號字元 (`
),這是 PowerShell 逸出字元。
在下列範例中,第一個 $i
變數前面的反引號字元會防止 PowerShell 以其值取代變數名稱。
例如:
$i = 5
"The value of `$i is $i."
這個指令輸出如下:
The value of $i is 5.
單引號字串
以單引弧括住的字串是 逐字字串 。 字串會與您輸入的命令一樣傳遞至命令。 不會執行替代。 例如:
$i = 5
'The value of $i is $i.'
這個指令輸出如下:
The value $i is $i.
同樣地,不會評估單引號字串中的表達式。 它們會解譯為字串常值。 例如:
'The value of $(2+3) is 5.'
這個指令輸出如下:
The value of $(2+3) is 5.
在字串中包含引號字元
若要讓雙引號出現在字串中,請以單引號括住整個字串。 例如:
'As they say, "live and learn."'
這個指令輸出如下:
As they say, "live and learn."
您也可以在雙引號字串中括住單引號字串。 例如:
"As they say, 'live and learn.'"
這個指令輸出如下:
As they say, 'live and learn.'
或者,在雙引號片語周圍加雙引號。 例如:
"As they say, ""live and learn."""
這個指令輸出如下:
As they say, "live and learn."
若要在單引號字串中包含單引號,請使用第二個連續單引號。 例如:
'don''t'
這個指令輸出如下:
don't
若要強制 PowerShell 以字面方式解譯雙引號,請使用反引號字元。 這可防止PowerShell將引號解譯為字串分隔符。 例如:
"Use a quotation mark (`") to begin a string."
'Use a quotation mark (`") to begin a string.'
由於單引號字串的內容會以常值方式解譯,因此反引號字元會被視為常值字元,並顯示在輸出中。
Use a quotation mark (") to begin a string.
Use a quotation mark (`") to begin a string.
因為 PowerShell 會將智慧引號解譯成一般引號,例如 ‘
、 ’
、 “
和 ”
,因此也需要逸出智慧引號。
例如:
"Double ““smart quotation marks`” must be escaped in a double-quoted string."
'Single ‘‘smart quotation marks’’ must be escaped in a single-quoted string.'
Double “smart quotation marks” must be escaped in a double-quoted string.
Single ‘smart quotation marks’ must be escaped in a single-quoted string.
Here-strings
此處字串的引號規則稍有不同。
here-string 是單引號或雙引號字串,以符號括住 (@
)。 此處字串內的引號會以字面方式解譯。
here-string:
- 跨越多行
- 開頭標記後面接著換行符
- 結尾為換行符,後面接著結尾標記
- 包含開頭和結尾標記之間的每一行,做為單一字串的一部分
如同一般字串,變數會以雙引號 here-string 取代其值。 在以單引弧括住的 here-strings 中,變數不會由其值取代。
您可以針對任何文字使用 here-strings,但對於下列類型的文字特別有用:
- 包含常值引號的文字
- 多行文字,例如 HTML 或 XML 區塊中的文字
- 文稿或函式檔的說明文字
here-string 可以有下列其中一種格式,其中 <Enter>
代表按下 ENTER 鍵時新增的換行字元或換行隱藏字元。
雙引號:
@"<Enter>
<string> [string] ...<Enter>
"@
單引號:
@'<Enter>
<string> [string] ...<Enter>
'@
注意
最後一個換行符是結尾標記的一部分。 它不會新增至 here-string。
here-string 包含開頭和結尾標記之間的所有文字。 在 here-string 中,所有引號都會以字面方式解譯。 例如:
@"
For help, type "get-help"
"@
這個指令輸出如下:
For help, type "get-help"
使用 here-string 可以簡化在命令中使用字串。 例如:
@"
Use a quotation mark, like ' or ", to begin a string.
"@
這個指令輸出如下:
Use a quotation mark, like ' or ", to begin a string.
在此處的單引號字串中,變數會以字面方式解譯並完全重現。 例如:
@'
The $profile variable contains the path
of your PowerShell profile.
'@
這個指令輸出如下:
The $profile variable contains the path
of your PowerShell profile.
在雙引號的 here-strings 中,變數會由其值取代。 例如:
@"
Even if you have not created a profile,
the path of the profile file is:
$profile.
"@
這個指令輸出如下:
Even if you have not created a profile,
the path of the profile file is:
C:\Users\User1\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1.
這裡字串通常用來將多行指派給變數。 例如,下列 here-string 會將 XML 頁面指派給 $page 變數。
$page = [XML] @"
<command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10"
xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10"
xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
<command:details>
<command:name>
Format-Table
</command:name>
<maml:description>
<maml:para>Formats the output as a table.</maml:para>
</maml:description>
<command:verb>format</command:verb>
<command:noun>table</command:noun>
<dev:version></dev:version>
</command:details>
...
</command:command>
"@
Here-strings 也是 Cmdlet 輸入 ConvertFrom-StringData
的便利格式,可將 here-strings 轉換成哈希表。
如需詳細資訊,請參閱ConvertFrom-StringData
。
注意
PowerShell 允許雙引號或單引號字串跨越多行,而不使用 @
here-string 的語法。 不過,這裡的完整字串語法是慣用的用法。
可展開字串的解譯
展開的字串不一定與您在控制台中看到的預設輸出相同。
集合,包括數位,會藉由在元素的字串表示之間放置單一空格,以轉換成字串。 您可以藉由設定喜好設定變數 $OFS
來指定不同的分隔符。 如需詳細資訊,請參閱 $OFS
喜好設定變數。
任何其他型別的實例會藉由呼叫 ToString()
方法轉換成字串,而此方法可能不會提供有意義的表示法。 例如:
"hashtable: $(@{ key = 'value' })"
hashtable: System.Collections.Hashtable
若要取得與 控制台中相同的輸出,請使用將 管線傳送至 Out-String
的子表達式。 Trim()
如果您想要移除任何開頭和尾端空行,請套用 方法。
"hashtable:`n$((@{ key = 'value' } | Out-String).Trim())"
hashtable:
Name Value
---- -----
key value
文化特性設定會影響字串解譯
方法 ToString()
會使用目前設定的文化特性設定,將值轉換成字串。 例如,下列 PowerShell 工作階段的文化特性會設定為 de-DE
。 ToString()
當 方法將 的值$x
轉換成字串時,它會使用逗號 (,
) 作為小數分隔符。 此外,方法會 ToString()
使用適用於德文地區設定的適當格式,將日期轉換成字串。
PS> Get-Culture
LCID Name DisplayName
---- ---- -----------
1031 de-DE German (Germany)
PS> $x = 1.2
PS> $x.ToString()
1,2
PS> (Get-Date 2024-03-19).ToString()
19.03.2024 00:00:00
不過,PowerShell 會在解譯可展開的字串表達式時,使用不因文化特性而異。
PS? "$x"
1.2
PS> "$(Get-Date 2024-03-19)"
03/19/2024 00:00:00
將引號字串傳遞至外部命令
某些原生命令需要包含引號字元的自變數。 PowerShell 會在將字串傳遞至外部命令之前,先解譯引號字串。 此解譯會移除外引號字元。
如需此行為的詳細資訊,請參閱 about_Parsing 文章。