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é $OFS
př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-DE
hodnotu . 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 .