about_Quoting_Rules

簡短描述

描述在 PowerShell 中使用單引號和雙引號的規則。

完整描述

引號是用來指定常值字串。 您可以將字串括在單引號 (') 或雙引號 (") 。

引號也可用來建立 here-string。 here-string 是單引號或雙引號字串,其中會以常值方式解譯引號。 here-string 可以跨越多行。 此處字串中的所有行都會解譯為字串,即使它們未以引號括住也一樣。

在遠端電腦的命令中,引號會定義在遠端電腦上執行的命令部分。 在遠端會話中,引號也會判斷命令中的變數會先在本機電腦或遠端電腦上解譯。

雙引號字串

以雙引號括住的字串是 可展開 的字串。 變數名稱前面加上貨幣符號 ($) 會取代為變數的值,再將字串傳遞至命令進行處理。

例如:

$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: 7.1.4

若要分隔變數名稱與字串中的後續字元,請將它括在大括弧 ({}) 。 如果變數名稱後面接著冒號 () : ,這特別重要。 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.

Here-strings

這裡字串的引號規則稍有不同。

here-string 是以引號括住的單引號或雙引號字串, @ () 。 這裡字串內的引號會以常值方式解譯。

here-string:

  • 跨越多行
  • 開頭標記後面接著分行符號
  • 結尾為分行符號,後面接著結束記號
  • 包含單一字串的開頭和結束記號之間的每一行

如同一般字串,變數會以雙引號括住的 here-strings 取代變數。 在以單引號括住的 here-strings 中,變數不會由其值取代。

您可以針對任何文字使用 here-strings,但它們特別適用于下列類型的文字:

  • 包含常值引號的文字
  • 多行文字,例如 HTML 或 XML 區塊中的文字
  • 腳本或函式檔的解說文字

here-string 可以有下列其中一種格式,其中 <Enter> 代表按下 ENTER 鍵時新增的換行字元或分行符號。

雙引號:

@"<Enter>
<string> [string] ...<Enter>
"@

單引號:

@'<Enter>
<string> [string] ...<Enter>
'@

注意

最後的分行符號是結束記號的一部分。 它不會新增至 here-string。

here-string 包含開頭和結束記號之間的所有文字。 在此字串中,所有引號都會以常值方式解譯。 例如:

@"
For help, type "get-help"
"@

此命令的輸出如下:

For help, type "get-help"

使用 here-string 可以簡化在命令中使用字串。 例如:

@"
Use a quotation mark (') to begin a string.
"@

此命令的輸出如下:

Use a quotation mark (') to begin a string.

在以單引號括住的 here-strings 中,變數會以常值方式解譯並完全重現。 例如:

@'
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>
"@

這裡字串也是 Cmdlet 輸入 ConvertFrom-StringData 的便利格式,可將 here-strings 轉換成雜湊表。 如需詳細資訊,請參閱ConvertFrom-StringData

注意

PowerShell 允許雙引號或單引號字串跨越多行,而不需使用 @ here-strings 的語法。 不過,這裡的完整字串語法是慣用的用法。

可展開字串的解譯

展開的字串不一定與您在主控台中看到的預設輸出相同。

集合,包括陣列,會藉由在元素的字串表示之間放置單一空格,以轉換成字串。 您可以藉由設定喜好設定變數 $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

將引號字串傳遞至外部命令

某些原生命令需要包含引號字元的引數。 PowerShell 會先解譯引號字串,再將它傳遞至外部命令。 此解譯會移除外部引號字元。

如需此行為的詳細資訊,請參閱 about_Parsing 一文。

另請參閱