Sdílet prostřednictvím


6. Převody

Redakční poznámka

Důležitý

specifikace jazyka Windows PowerShell 3.0 byla publikována v prosinci 2012 a je založená na prostředí Windows PowerShell 3.0. Tato specifikace neodráží aktuální stav PowerShellu. Tato dokumentace se neplánuje aktualizovat tak, aby odrážela aktuální stav. Tato dokumentace je zde uvedena pro historické reference.

Dokument specifikace je k dispozici jako dokument aplikace Microsoft Word z webu Microsoft Download Center na adrese: https://www.microsoft.com/download/details.aspx?id=36389 Dokument aplikace Word byl převeden pro prezentaci zde na webu Microsoft Learn. Během převodu byly provedeny některé redakční změny tak, aby vyhovovaly formátování pro platformu Docs. Některé překlepy a menší chyby byly opraveny.

Převod typu se provádí, když je hodnota jednoho typu použita v kontextu, který vyžaduje jiný typ. Pokud k takovému převodu dojde automaticky, označuje se jako implicitní převod. (Běžný příklad je u některých operátorů, které potřebují převést jednu nebo více hodnot určených jejich operandy.) Implicitní převod je povolen za předpokladu, že se zachová smysl zdrojové hodnoty, například bez ztráty přesnosti čísla při převodu.

Operátor převodu (§7.2.9) umožňuje explicitní převod.

Převody jsou popsány níže s doplňujícími informacemi, které jsou poskytovány podle potřeby v popisu každého operátora v §6.19.

Explicitní převod hodnoty na typ, který již má, nezpůsobí žádné změny této hodnoty ani její reprezentace.

Pravidla pro zpracování konverze, pokud je hodnota výrazu vázána na parametr, jsou zahrnuta v §6.17.

6.1 Převod na void

Hodnotu libovolného typu lze explicitně zahodit přetypováním na typ void. Neexistuje žádný výsledek.

6.2 Převod na bool

Pravidla pro převod jakékoli hodnoty na typ bool jsou následující:

  • Číselná nebo znaková hodnota nuly je převedena na hodnotu False; Číselná nebo znaková hodnota bez nuly se převede na hodnotu True.
  • Hodnota typu null je převedena na False.
  • Řetězec délky 0 je převeden na False; Řetězec délky > 0 je převeden na hodnotu True.
  • Parametr přepínače s hodnotou $true se převede na True a druhý s hodnotou $false se převede na False.
  • Všechny ostatní hodnoty odkazového typu, které nejsou null, se převedou na hodnotu True.

Pokud typ implementuje IList:

  • Pokud je délka objektu > 2, hodnota se převede na True.
  • Pokud je délka objektu 1 a první prvek není sám iList, pak pokud hodnota daného prvku je true, hodnota je převedena na True.
  • V opačném případě, pokud počet prvního prvku >= 1, hodnota je převedena na True.
  • V opačném případě se hodnota převede na False.

6.3 Převod na znak

Pravidla pro převod libovolné hodnoty na znak typu jsou následující:

  • Převod hodnoty typu bool, decimal, float nebo double je chybný.
  • Hodnota typu null se převede na znak null (U+0000).
  • Celočíselná hodnota, jejíž hodnota může být reprezentována v typu char má tuto hodnotu; jinak je převod chybný.
  • Převod řetězcové hodnoty, která má jinou délku než 1, je chybný.
  • Řetězcová hodnota s délkou 1 se převede na znak, který má hodnotu jednoho znaku.
  • Číselná hodnota typu, jejíž hodnota po zaokrouhlení libovolné desetinné části může být reprezentována v cílovém typu, která má zaokrouhlenou hodnotu; jinak je převod chybný.
  • U jiných hodnot referenčního typu, pokud typ odkazu takový převod podporuje, použije se tento převod; jinak je převod chybný.

6.4 Převod na celé číslo

Pravidla pro převod libovolné hodnoty na bajt, int nebo long jsou následující:

  • Logická hodnota False je převedena na nulu; logická hodnota True je převedena na 1.
  • Hodnota typu znak, jejíž hodnotu lze reprezentovat v cílovém typu, má tuto hodnotu; jinak je převod chybný.
  • Číselná hodnota typu, jejíž hodnota po zaokrouhlení libovolné desetinné části může být reprezentována v cílovém typu, která má zaokrouhlenou hodnotu; jinak je převod chybný.
  • Hodnota typu null se převede na nulu.
  • Řetězec představující číslo je převeden tak, jak je popsáno v §6.16. Pokud po zkrácení zlomkové části může být výsledek reprezentován v cílovém typu, pak je řetězec dobře formátován a má cílový typ; jinak je převod chybný. Pokud řetězec nepředstavuje číslo, převod je chybný.
  • U jiných hodnot referenčního typu, pokud typ odkazu takový převod podporuje, použije se tento převod; jinak je převod chybný.

6.5 Převod na plovoucí a dvojitý

Pravidla pro převod libovolné hodnoty na typ float nebo double jsou následující:

  • Logická hodnota False je převedena na nulu; logická hodnota True je převedena na 1.
  • Hodnota znaku je reprezentována přesně.
  • Číselná hodnota typu je reprezentována přesně, pokud je to možné; u převodů typu int, long a decimal na typ float a u převodů typu long a decimal na typ double může dojít ke ztrátě některých nejméně významných bitů celočíselné hodnoty.
  • Hodnota typu null se převede na nulu.
  • Řetězec představující číslo je převeden tak, jak je popsáno v §6.16; jinak je převod chybný.
  • U jiných hodnot referenčního typu, pokud typ odkazu takový převod podporuje, použije se tento převod; jinak je převod chybný.

6.6 Převod na desítkové

Pravidla pro převod libovolné hodnoty na desítkové číslo jsou následující:

  • Logická hodnota False je převedena na nulu; logická hodnota True je převedena na 1.
  • Hodnota typu znak je reprezentována přesně.
  • Hodnota číselného typu je reprezentována přesně; Pokud je však tato hodnota příliš velká nebo příliš malá, aby se vešla do cílového typu, převod je chybný.
  • Hodnota typu null se převede na nulu.
  • Řetězec představující číslo je převeden tak, jak je popsáno v §6.16; jinak je převod chybný.
  • U jiných hodnot referenčního typu, pokud typ odkazu takový převod podporuje, použije se tento převod; jinak je převod chybný.
  • Velikost výsledku úspěšného převodu je taková, že desetinná část nemá koncové nuly.

6.7 Převod na objekt

Hodnotu libovolného typu s výjimkou typu null (4.1.2) lze převést na objekt typu. Tato hodnota zachovává svůj typ a reprezentaci.

6.8 Převod na řetězec

Pravidla pro převod libovolné hodnoty na typ řetězce jsou následující:

  • Logická hodnota $false je převedena na "False"; logická hodnota $true je převedena na True.
  • Hodnota typu znak je převedena na řetězec s 1 znakem obsahující tento znak.
  • Číselná hodnota typu se převede na řetězec, který má tvar odpovídajícího číselného literálu. Výsledek ale nemá žádné úvodní nebo koncové mezery, žádné počáteční znaménko plus, celá čísla mají základ 10 a neexistuje žádná přípona typu. Pro převod desetinného čísla je měřítko zachováno. Pro hodnoty -∞, +∞ a NaN jsou výsledné řetězce "-Infinity", "Nekonečno" a "NaN".
  • Hodnota typu null je převedena na prázdný řetězec.
  • U 1rozměrného pole je výsledkem řetězec obsahující hodnotu každého prvku v dané matici, od začátku do konce, převedené na řetězec, přičemž prvky jsou odděleny aktuálním oddělovačem výstupních polí (§2.3.2.2). Pro pole s prvky, které jsou samy o sobě pole, jsou převedeny pouze prvky na nejvyšší úrovni. Řetězec použitý k reprezentaci hodnoty prvku, který je polem, je definován implementací. U multidimenzionálního pole je zploštěno (§9.12) a poté považováno za 1-dimenzionální pole.
  • Hodnota typu null je převedena na prázdný řetězec.
  • Hodnota typu scriptblock je převedena na řetězec obsahující text tohoto bloku bez oddělovače { a } znaků.
  • Pro hodnotu typu výčtu je výsledkem řetězec obsahující název každé konstanty výčtu kódované v této hodnotě oddělené čárkami.
  • U jiných hodnot referenčního typu, pokud typ odkazu takový převod podporuje, použije se tento převod; jinak je převod chybný.

Řetězec použitý k reprezentaci hodnoty prvku, který je polem, má tvar System.type[], System.type[,]atd. Pro jiné odkazové typy je volána metoda ToString. U jiných výčtových typů se zdrojová hodnota považuje za 1rozměrné pole.

6.9 Převod na pole

Pravidla pro převod libovolné hodnoty na typ pole jsou následující:

  • Cílový typ nesmí být multidimenzionální pole.
  • Hodnota typu null je zachována tak, jak je.
  • Pro skalární hodnotu jinou než $null nebo hodnotu typu hashtable se vytvoří nové pole s 1 prvkem, jehož hodnota je skalární po převedení na typ cílového prvku.
  • Pro hodnotu 1rozměrného pole se vytvoří nové pole cílového typu a každý prvek se zkopíruje s převodem ze zdrojového pole na odpovídající prvek v cílovém poli.
  • Pro vícerozměrnou hodnotu pole je toto pole nejprve zploštěno (§9.12) a poté považováno za hodnotu jednorozměrného pole.
  • Řetězcová hodnota se převede na pole znaků se stejnou délkou, přičemž po sobě jdoucí znaky z řetězce zabírají odpovídající pozice v poli.

Pro jiné výčtové typy je vytvořeno nové pole s jedním prvkem, jehož hodnota je odpovídající prvek po převedení na cílový typ prvku, pokud takový převod existuje. V opačném případě je převod chybný.

6.10 Převod na xml

Objekt je převeden na typ řetězec a poté do objektu dokumentu XML typu xml.

6.11 Převod na regulární výraz

Výraz, který určuje hodnotu typu řetězec, lze převést na typ regex.

6.12 Převod na skriptblok

Pravidla pro převod libovolné hodnoty na typ scriptblock jsou následující:

  • Řetězcová hodnota je považována za název příkazu, po kterém mohou volitelně následovat argumenty pro volání tohoto příkazu.

6.13 Převod na typy výčtů

Pravidla pro převod jakékoli hodnoty na typ výčtu jsou následující:

  • Hodnota typu řetězec obsahující jednu z pojmenovaných hodnot (s ohledem na případ) pro typ výčtu je převedena na tuto pojmenovanou hodnotu.
  • Hodnota typu řetězec obsahující čárkami oddělený seznam pojmenovaných hodnot (s rozlišením velkých a malých písmen) pro typ výčtu je převedena na bitový OR všech těchto pojmenovaných hodnot.

6.14 Převod na jiné odkazové typy

Pravidla pro převod libovolné hodnoty na jiný typ odkazu než typ pole nebo řetězec jsou následující:

  • Hodnota typu null je zachována tak, jak je.
  • V opačném případě je chování definováno implementací.

Zde vstupuje do hry řada mechanismů; patří mezi ně možné použití konstruktorů s jedním argumentem nebo výchozích konstruktorů, pokud je hodnota hashtable, implicitní a explicitní převodní operátory a metody Parse pro cílový typ; použití Convert.ConvertTo; a převodní mechanismus ETS.

6.15 Obvyklé aritmetické převody

Pokud žádný operand neurčí hodnotu s číselným typem, pak

  • Pokud levý operand určuje hodnotu typu bool, převod je chybný.
  • Jinak se všechny operandy označující hodnotu $null se převedou na nulu typu int a proces pokračuje číselnými převody uvedenými níže.
  • V opačném případě, pokud levý operand určuje hodnotu typu char a pravý operand určuje hodnotu typu bool, převod je chybný.
  • V opačném případě, pokud levý operand určuje hodnotu typu řetězec, ale nepředstavuje číslo (§6.16), převod je chybný.
  • V opačném případě, pokud pravý operand určuje hodnotu typu řetězec, ale nepředstavuje číslo (§6.16), převod je chybný.
  • V opačném případě jsou všechny operandy označující hodnoty typu řetězec převedeny na čísla (§6.16) a proces pokračuje s číselnými převody uvedenými níže.
  • V opačném případě je převod chybný.

Číselné převody:

  • Pokud jeden operand určuje hodnotu typu decimal, hodnota určená druhým operandem se v případě potřeby převede na tento typ. Výsledek má datový typ decimal.
  • V opačném případě, pokud jeden operand určuje hodnotu typu double, hodnota určená druhým operandem je v případě potřeby převedena na tento typ. Výsledek má typ "double".
  • V opačném případě, pokud jeden operand určuje hodnotu typu float, hodnoty určené oběma operandy jsou v případě potřeby převedeny na typ double. Výsledek má typ double.
  • V opačném případě, pokud jeden operand určuje hodnotu typu long, hodnota určená druhou hodnotou operandu je v případě potřeby převedena na tento typ. Výsledek má první typ v sekvenci long a double, který může představovat jeho hodnotu.
  • V opačném případě se hodnoty určené oběma operandy v případě potřeby převedou na typ int. Výsledek má první hodnotu v pořadí int, long, double, která může reprezentovat jeho hodnotu bez ztráty přesnosti.

6.16 Převod z řetězce na číselný typ

V závislosti na jeho obsahu lze řetězec explicitně nebo implicitně převést na číselnou hodnotu. Konkrétně

  • Prázdný řetězec se převede na hodnotu nula.
  • Úvodní a koncové mezery jsou ignorovány; Řetězec se však nemusí skládat pouze z mezer.
  • Řetězec obsahující pouze prázdné znaky a/nebo ukončovací znaky řádku se převede na hodnotu nula.
  • Je povoleno jedno úvodní znaménko + nebo -.
  • Celé číslo může mít šestnáctkovou předponu (0x nebo 0X).
  • Je povolen exponent s volitelným znaménkem.
  • Přípony typů a násobitele nejsou povoleny.
  • Řetězce s jedinečnými písmeny "-Infinity", "Infinity" a "NaN" jsou rozpoznány jako hodnoty -∞, +∞ a NaN.

6.17 Převod během vazby parametru

Informace o vazbě parametru naleznete v §8.14.

Pokud je hodnota výrazu svázaná s parametrem, je potřeba vzít v úvahu další aspekty převodu, jak je popsáno níže:

  • Je-li typ parametru přepínač (§4.2.5, §8.10.5) a parametr nemá žádný argument, hodnota parametru volaného příkazu je nastavena na $true. Pokud je typ parametru jiný než přepínač, parametr, který nemá žádný argument, je chybný.
  • Pokud je typ parametru přepínač a hodnota argumentu je $null, hodnota parametru je nastavena na $false.
  • Pokud je typ parametru objekt nebo je stejný jako typ argumentu, předá se hodnota argumentu bez převodu.
  • Pokud typ parametru není objekt nebo scriptblock, vyhodnotí se argument s typem scriptblock a jeho výsledek se předá jako hodnota argumentu. (To se označuje jako zpožděná vazba skriptového bloku.) Pokud je typem parametru objekt nebo scriptblock, argument s typem scriptblock se předá tak, jak je.
  • Pokud je typ parametru kolekce typu T2 a argument je skalár typu T1, tento skalár se převede na kolekci typu T2 obsahující jeden prvek. V případě potřeby se skalární hodnota převede na typ T2 pomocí pravidel převodu této části.
  • Pokud je typ parametru jiný skalární typ než objekt a argument je kolekce, argument je chybný.
  • Pokud je očekávaným typem parametru kolekce typu T2 a argumentem je kolekce typu T1, je argument převeden na kolekci typu T2 se stejnou délkou jako kolekce argumentů. V případě potřeby se hodnoty prvků kolekce argumentů převedou na typ T2 pomocí pravidel převodu této části.
  • Pokud výše uvedené kroky a převody uvedené výše v této kapitole nestačí, použijí se pravidla v §6.18. Pokud selžou, vazba parametru selže.

6.18 Převod rozhraní .NET

U implicitního převodu se nejdříve použijí vestavěné převody v PowerShellu. Pokud nemohou provést převod, použijí se následující vlastní převodníky .NET, postupně odshora dolů. Pokud se najde převod, ale vyvolá výjimku, převod se nezdařil.

  • PSTypeConverter: Existují dva způsoby přidružení implementace PSTypeConverter třídy s cílovou třídou: prostřednictvím konfiguračního souboru typu (types.ps1xml) nebo použitím atributu System.ComponentModel.TypeConverterAttribute cílové třídy. Další informace najdete v dokumentaci k sadě PowerShell SDK.

  • TypeConverter: Tento typ CLR poskytuje jednotný způsob převodu typů hodnot na jiné typy a také pro přístup ke standardním hodnotám a dílčím vlastnostem. Nejběžnějším typem převaděče je takový, který převádí do textové podoby a z textové podoby. Převaděč typů třídy je vázán na třídu s System.ComponentModel.TypeConverterAttribute. Pokud tento atribut není přepsán, všechny třídy, které dědí z této třídy, používají stejný převaděč typů jako základní třída. Další informace najdete v dokumentaci k sadě PowerShell SDK a rozhraní Microsoft .NET Framework.

  • Parsovat metodu: Pokud je zdrojový typ řetězec a cílový typ má metodu s názvem Parse, tato metoda je volána k provedení převodu.

  • konstruktory: Pokud má cílový typ konstruktor s jedním argumentem, který má typ zdrojového typu, je tento konstruktor volán k provedení převodu.

  • operátor implicitního přetypování: Pokud má zdrojový typ implicitní operátor přetypování, který se použije pro převod na cílový typ, je tento operátor volán k provedení převodu.

  • Operátor explicitního přetypování: Pokud má zdrojový typ explicitní operátor přetypování, který převádí na cílový typ, je tento operátor volán k provedení převodu. Pokud má cílový typ explicitní operátor přetypování, který převádí ze zdrojového typu, je tento operátor volán k provedení převodu.

  • IConvertable: System.Convert.ChangeType je volána k provedení převodu.

6.19 Převod na objednaný

Pravidla pro převod libovolné hodnoty na pseudo-typ seřazené jsou následující:

  • Pokud je hodnota hash literál (§2.3.5.6), výsledkem je objekt s typem definovaným implementací, který se chová jako hashovací tabulka a pořadí klíčů odpovídá pořadí zadanému v literálu hash.
  • V opačném případě je chování definováno implementací.

Pouze hash literály (§2.3.5.6) lze převést na seřaditelné. Výsledkem je instance System.Collections.Specialized.OrderedDictionary.

6.20 Převod na pscustomobject

Pravidla pro převod libovolné hodnoty na pseudotyp pscustomobject jsou následující:

  • Hodnota hashtable typu se převede na objekt PowerShellu. Každý klíč v hashtable se stane NoteProperty s odpovídající hodnotou.
  • V opačném případě je chování definováno implementací.

Převod je vždy povolený, ale nemění typ hodnoty.