about_Quoting_Rules

Krátký popis

Popisuje pravidla použití jednoduchých a dvojitých uvozovek v PowerShellu.

Dlouhý popis

Při analýze powershell nejprve interpretuje vstup jako výraz. Při vyvolání příkazu ale probíhá analýza v režimu argumentu. Nečíselné argumenty bez uvozovek se považují za řetězce. Pokud máte argumenty, které obsahují mezery, například cesty, musíte tyto hodnoty argumentů uzavřít do uvozovek. Další informace o analýze argumentů naleznete v části Režim argumentu about_Parsing.

Uvozovky slouží k zadání literálového řetězce. Řetězec můžete uzavřít do jednoduchých uvozovek (') nebo dvojitých uvozovek (").

Uvozovky se také používají k vytvoření řetězce sem. Zde-řetězec je řetězec s jednoduchým nebo dvojitým uvozovkam, ve kterém jsou uvozovky interpretovány doslova. Zde-řetězec může obsahovat více řádků. Všechny řádky v tomto řetězci se interpretují jako řetězce, i když nejsou uzavřené do uvozovek.

V příkazech pro vzdálené počítače uvozovky definují části příkazu, které jsou spuštěny ve vzdáleném počítači. Ve vzdálené relaci uvozovky také určují, zda jsou proměnné v příkazu interpretovány jako první v místním počítači nebo ve vzdáleném počítači.

Poznámka:

PowerShell považuje inteligentní uvozovky, označované také jako typografické nebo složené uvozovky, jako normální uvozovky pro řetězce. Nepoužívejte inteligentní uvozovky k uzavření řetězců. Při psaní řetězců, které obsahují inteligentní uvozovky, postupujte podle pokynů v uvozovkách v řetězcové části tohoto dokumentu. Další informace o inteligentních uvozovkách naleznete v části Inteligentní uvozovky v článku Wikipedie uvozovky v angličtině.

Řetězce s dvojitou uvozovou znaky

Řetězec uzavřený do dvojitých uvozovek je rozbalitelný řetězec. Názvy proměnných před znakem dolaru ($) se nahradí hodnotou proměnné před předáním řetězce příkazu ke zpracování.

Příklad:

$i = 5
"The value of $i is $i."

Výstupem tohoto příkazu je:

The value of 5 is 5.

V řetězci s dvojitou uvozovou sadou se také vyhodnocují výrazy a výsledek se vloží do řetězce. Příklad:

"The value of $(2+3) is 5."

Výstupem tohoto příkazu je:

The value of 5 is 5.

Do rozbalitelného řetězce lze přímo vložit pouze základní odkazy na proměnné. Odkazy na proměnné používající indexování pole nebo přístup členů musí být uzavřeny do dílčího výrazu. Příklad:

"PS version: $($PSVersionTable.PSVersion)"
PS version: 7.4.5

Pokud chcete název proměnné oddělit od dalších znaků v řetězci, uzavřete ho do složených závorek ({}). To je zvlášť důležité, pokud za názvem proměnné následuje dvojtečka (:). PowerShell považuje vše mezi $ specifikátorem oboru a : oborem, což obvykle způsobuje selhání interpretace. Například "$HOME: where the heart is." vyvolá chybu, ale "${HOME}: where the heart is." funguje podle očekávání.

Pokud chcete zabránit nahrazení hodnoty proměnné v řetězci s dvojitým uvozováním, použijte znak zpětného zápisu (`), což je řídicí znak PowerShellu.

V následujícím příkladu znak backtick, který předchází první $i proměnné, zabrání PowerShellu nahradit název proměnné jeho hodnotou. Příklad:

$i = 5
"The value of `$i is $i."

Výstupem tohoto příkazu je:

The value of $i is 5.

Řetězce s jednoduchými uvozovými znaky

Řetězec uzavřený v jednoduchých uvozovkách je doslovný řetězec. Řetězec se předá příkazu přesně tak, jak ho zadáte. Neprovádí se žádná náhrada. Příklad:

$i = 5
'The value of $i is $i.'

Výstupem tohoto příkazu je:

The value $i is $i.

Podobně se nevyhodnocují výrazy v řetězcích s jedním uvozem. Interpretují se jako řetězcové literály. Příklad:

'The value of $(2+3) is 5.'

Výstupem tohoto příkazu je:

The value of $(2+3) is 5.

Zahrnutí znaků uvozovek do řetězce

Pokud chcete, aby se v řetězci zobrazovaly dvojité uvozovky, uzavřete celý řetězec do jednoduchých uvozovek. Příklad:

'As they say, "live and learn."'

Výstupem tohoto příkazu je:

As they say, "live and learn."

Řetězec s jednou uvozovou sadou můžete uzavřít také do řetězce s dvojitou uvozovou sadou. Příklad:

"As they say, 'live and learn.'"

Výstupem tohoto příkazu je:

As they say, 'live and learn.'

Nebo poklikejte uvozovky kolem dvojité uvozovky. Příklad:

"As they say, ""live and learn."""

Výstupem tohoto příkazu je:

As they say, "live and learn."

Pokud chcete do řetězce s jednou uvozovkou zahrnout jednu uvozovku, použijte druhou po sobě jdoucí jednoduchou uvozovku. Příklad:

'don''t'

Výstupem tohoto příkazu je:

don't

Pokud chcete, aby PowerShell interpretovat dvojitou uvozovku doslova, použijte zpětný znak. To zabrání PowerShellu interpretovat uvozovky jako oddělovač řetězců. Příklad:

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

Vzhledem k tomu, že obsah řetězců s jednoduchými uvozovými znaky se interpretuje doslova, zachází se zpětným znakem jako s literálovým znakem a zobrazí se ve výstupu.

Use a quotation mark (") to begin a string.
Use a quotation mark (`") to begin a string.

Vzhledem k tomu, že PowerShell interpretuje inteligentní uvozovky, jako je , , a , jako normální uvozovky, musí být také uvozovky. Příklad:

"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.

Zde uvedené řetězce

Pravidla uvozovekproch

Here-string je řetězec s jednoduchým nebo dvojitým uvozováním obklopený znakem (@). Uvozovky v řetězci se interpretují doslova.

Řetězec se zde:

  • spans multiple lines
  • začíná levou značkou následovanou novým řádekem.
  • končí novým řádekem následovaným pravou značkou.
  • zahrnuje každý řádek mezi levou a pravou značkou jako součást jednoho řetězce.

Stejně jako běžné řetězce jsou proměnné nahrazeny jejich hodnotami v dvojitých uvozových řetězcích. V jednoduchých uvozovaných řetězcích se proměnné nenahrazovat jejich hodnotami.

Tady můžete použít řetězce pro libovolný text, ale jsou zvláště užitečné pro následující druhy textu:

  • Text obsahující uvozovky literálů
  • Více řádků textu, například text v bloku HTML nebo XML
  • Text nápovědy pro skript nebo dokument funkce

Zde-řetězec může mít některý z následujících formátů, kde <Enter> představuje skrytý znak řádku nebo nový řádek, který se přidá při stisknutí klávesy ENTER .

Dvojité uvozovky:

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

Jednoduché uvozovky:

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

Poznámka:

Poslední znak nového řádku je součástí uzavírací značky. Nepřidá se do tohoto řetězce.

Řetězec se zde obsahuje veškerý text mezi levou a pravou značkou. V řetězci se všechny uvozovky interpretují doslova. Příklad:

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

Výstupem tohoto příkazu je:

For help, type "get-help"

Použití zde-řetězce může zjednodušit použití řetězce v příkazu. Příklad:

@"
Use a quotation mark, like ' or ", to begin a string.
"@

Výstupem tohoto příkazu je:

Use a quotation mark, like ' or ", to begin a string.

V jednoduchých uvozovaných řetězcích se proměnné interpretují doslova a reprodukují přesně. Příklad:

@'
The $profile variable contains the path
of your PowerShell profile.
'@

Výstupem tohoto příkazu je:

The $profile variable contains the path
of your PowerShell profile.

V dvojitých uvozových řetězcích jsou proměnné nahrazeny jejich hodnotami. Příklad:

@"
Even if you have not created a profile,
the path of the profile file is:
$profile.
"@

Výstupem tohoto příkazu je:

Even if you have not created a profile,
the path of the profile file is:
C:\Users\User1\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1.

Zde-řetězce se obvykle používají k přiřazení více řádků proměnné. Například následující zde-řetězec přiřadí stránku XML $page proměnné.

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

Tyto řetězce jsou také pohodlným formátem pro vstup do ConvertFrom-StringData rutiny, který převádí řetězce sem na hashovací tabulky. Další informace najdete na webu ConvertFrom-StringData.

Poznámka:

PowerShell umožňuje, aby řetězce s dvojitými nebo jednoduchými uvozovky přesahovaly více řádků bez použití @ syntaxe těchto řetězců. Plně zde-řetězcová syntaxe je však upřednostňovaným použitím.

Interpretace rozbalitelných řetězců

Rozšířené řetězce nemusí nutně vypadat stejně jako výchozí výstup, který vidíte v konzole.

Kolekce, včetně polí, jsou převedeny na řetězce umístěním jediné mezery mezi řetězcové reprezentace prvků. Jinou oddělovač lze určit nastavením proměnné $OFSpředvoleb . Další informace najdete v $OFS proměnné předvoleb.

Instance jakéhokoli jiného typu jsou převedeny na řetězce voláním ToString() metody, která nemusí dávat smysluplné vyjádření. Příklad:

"hashtable: $(@{ key = 'value' })"
hashtable: System.Collections.Hashtable

Pokud chcete získat stejný výstup jako v konzole, použijte dílčí výraz, ve kterém kanálujete .Out-String Použijte metodu Trim() , pokud chcete odebrat všechny úvodní a koncové prázdné řádky.

"hashtable:`n$((@{ key = 'value' } | Out-String).Trim())"
hashtable:
Name                           Value
----                           -----
key                            value

Nastavení jazykové verze má vliv na interpretaci řetězců

Metody ToString() používají aktuální nakonfigurovaná nastavení jazykové verze k převodu hodnot na řetězce. Například jazyková verze následující relace PowerShellu je nastavená na de-DEhodnotu . ToString() Když metoda převede hodnotu $x na řetězec, použije čárku (,) pro oddělovač desetinných míst. ToString() Metoda také převede datum na řetězec pomocí vhodného formátu pro nastavení německého národního prostředí.

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 však při interpretaci rozbalitelných řetězcových výrazů používá invariantní jazykovou verzi.

PS? "$x"
1.2

PS> "$(Get-Date 2024-03-19)"
03/19/2024 00:00:00

Předávání řetězců s uvozovými znaky externím příkazům

Některé nativní příkazy očekávají argumenty, které obsahují znaky uvozovek. PowerShell interpretuje uvozovaný řetězec před jeho předáním externímu příkazu. Tato interpretace odebere vnější znaky uvozovek.

Další informace o tomto chování najdete v článku about_Parsing .

Viz také