Udostępnij za pośrednictwem


6. Konwersje

Notatka redakcyjna

Ważny

Specyfikacja języka programu Windows PowerShell 3. 0 została opublikowana w grudniu 2012 r. i jest oparta na programie Windows PowerShell 3.0. Ta specyfikacja nie odzwierciedla bieżącego stanu programu PowerShell. Nie ma planu aktualizacji tej dokumentacji w celu odzwierciedlenia bieżącego stanu. Ta dokumentacja jest przedstawiona tutaj w celu uzyskania informacji historycznych.

Dokument specyfikacji jest dostępny jako dokument programu Microsoft Word z Centrum pobierania Microsoft pod adresem: https://www.microsoft.com/download/details.aspx?id=36389 Dokument programu Word został przekonwertowany na prezentację tutaj w witrynie Microsoft Learn. Podczas konwersji wprowadzono pewne zmiany redakcyjne w celu dostosowania formatowania dla platformy Docs. Usunięto niektóre literówki i drobne błędy.

Konwersję typu przeprowadza się, gdy wartość jednego typu jest używana w kontekście wymagającym innego typu. Jeśli taka konwersja odbywa się automatycznie, jest znana jako niejawna konwersja. (Typowym przykładem tego jest użycie niektórych operatorów, które muszą przekonwertować co najmniej jedną wartość wyznaczoną przez operandy). Konwersja niejawna jest dozwolona, pod warunkiem, że poczucie wartości źródłowej jest zachowywane, na przykład bez utraty precyzji liczby podczas konwersji.

Operator rzutowania (§7.2.9) umożliwia jawną konwersję.

Konwersje omówiono poniżej, a w razie potrzeby dodatkowe informacje są podane w opisie każdego operatora w §6.19.

Jawna konwersja wartości na typ, który już ma, nie powoduje zmiany tej wartości ani jej reprezentacji.

Zasady dotyczące konwersji, kiedy wartość wyrażenia jest przypisywana do parametru, są objęte w §6.17.

6.1 Konwersja na void

Wartość dowolnego typu można jawnie odrzucić, odrzucając ją do typu void. Nie ma żadnego wyniku.

6.2 Konwersja na wartość logiczną

Reguły konwertowania dowolnej wartości na wartość logiczną typu są następujące:

  • Wartość liczbowa lub znakowa równa zero jest konwertowana na wartość fałsz; wartość liczbowa lub znakowa różna od zera jest konwertowana na wartość prawda.
  • Wartość typu null jest konwertowana na wartość False.
  • Ciąg o długości 0 jest konwertowany na wartość False; ciąg o długości > 0 jest konwertowany na wartość True.
  • Parametr przełącznika z wartością $true jest konwertowany na wartość True, a drugi z wartością $false jest konwertowany na wartość False.
  • Wszystkie inne wartości typu odwołania innego niż null są konwertowane na wartość True.

Jeśli typ implementuje element IList:

  • Jeśli długość obiektu wynosi > 2, wartość zostaje przekonwertowana na True.
  • Jeśli długość obiektu wynosi 1, a pierwszy element nie jest sam w sobie IList, to jeśli wartość tego elementu jest prawdziwa, wartość zostaje przekonwertowana na wartość Prawda.
  • W przeciwnym razie, jeśli liczba pierwszego elementu >= 1, wartość jest konwertowana na wartość True.
  • W przeciwnym razie wartość jest konwertowana na wartość Fałsz.

6.3 Konwersja na znak

Reguły konwertowania dowolnej wartości na typ char są następujące:

  • Konwersja wartości typu bool, dziesiętna, zmiennoprzecinkowa lub podwójna jest błędna.
  • Wartość typu null jest konwertowana na znak null (U+0000).
  • Wartość typu liczba całkowita, której wartość może być reprezentowana w typie char, ma ta wartość; w przeciwnym razie konwersja jest w błędzie.
  • Konwersja wartości ciągu o długości innej niż 1 jest błędna.
  • Wartość ciągu o długości 1 jest konwertowana na znak o wartości jednego znaku.
  • Wartość typu liczbowego, której wartość po zaokrągleniu dowolnej części ułamkowej może być reprezentowana w typie docelowym, ma zaokrągloną wartość; w przeciwnym razie konwersja jest w błędzie.
  • W przypadku innych wartości typu odwołania, jeśli typ odwołania obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest w błędzie.

Konwersja na liczbę całkowitą 6.4

Reguły konwertowania dowolnej wartości na bajt typu, int lub long są następujące:

  • Wartość logiczna Fałsz jest konwertowana na zero; wartość logiczna True jest konwertowana na wartość 1.
  • Wartość typu char, której wartość może być reprezentowana w typie docelowym, przyjmuje tę wartość; w przeciwnym razie konwersja jest niepoprawna.
  • Wartość typu liczbowego, której wartość po zaokrągleniu dowolnej części ułamkowej może być reprezentowana w typie docelowym, ma zaokrągloną wartość; w przeciwnym razie konwersja jest w błędzie.
  • Wartość typu null jest konwertowana na zero.
  • Ciąg reprezentujący liczbę jest konwertowany zgodnie z opisem w §6.16. Jeśli po obcięciu części ułamkowej wynik może być reprezentowany w typie docelowym, ciąg jest poprawnie sformułowany i ma typ docelowy; w przeciwnym razie konwersja jest w błędzie. Jeśli ciąg nie reprezentuje liczby, konwersja jest błędna.
  • W przypadku innych wartości typu odwołania, jeśli typ odwołania obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest w błędzie.

6.5 Konwersja na zmiennoprzecinkowe i podwójne

Zasady konwertowania dowolnej wartości na typ float lub double są następujące:

  • Wartość logiczna Fałsz jest konwertowana na zero; wartość logiczna True jest konwertowana na wartość 1.
  • Wartość char jest reprezentowana dokładnie.
  • Wartość typu liczbowego jest reprezentowana dokładnie, jeśli to możliwe; jednak w przypadku konwersji int, long oraz decimal na float, a także konwersji long i decimal na double, niektóre z najmniej znaczących bitów wartości całkowitej mogą zostać utracone.
  • Wartość typu null jest konwertowana na zero.
  • Ciąg reprezentujący liczbę jest konwertowany zgodnie z opisem w §6.16; w przeciwnym razie konwersja jest w błędzie.
  • W przypadku innych wartości typu odwołania, jeśli typ odwołania obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest w błędzie.

6.6 Konwersja na liczbę dziesiętną

Reguły konwertowania dowolnej wartości na typ dziesiętny są następujące:

  • Wartość logiczna Fałsz jest konwertowana na zero; wartość logiczna True jest konwertowana na wartość 1.
  • Wartość typu char jest reprezentowana dokładnie.
  • Wartość typu liczbowego jest reprezentowana dokładnie; jeśli jednak ta wartość jest zbyt duża lub zbyt mała, aby zmieścić się w typie docelowym, konwersja jest w błędzie.
  • Wartość typu null jest konwertowana na zero.
  • Ciąg reprezentujący liczbę jest konwertowany zgodnie z opisem w §6.16; w przeciwnym razie konwersja jest w błędzie.
  • W przypadku innych wartości typu odwołania, jeśli typ odwołania obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest w błędzie.
  • Skala wyniku pomyślnej konwersji jest taka, że część ułamkowa nie ma zer końcowych.

6.7 Konwersja na obiekt

Wartość dowolnego typu z wyjątkiem typu null (4.1.2) można przekonwertować na obiekt typu. Wartość zachowuje swój typ i reprezentację.

6.8 Konwersja na ciąg znaków

Reguły konwertowania dowolnej wartości na ciąg typu są następujące:

  • Wartość logiczna $false jest konwertowana na wartość "Fałsz"; wartość logiczna $true jest konwertowana na wartość "True".
  • Wartość typu char jest konwertowana na ciąg 1-znakowy zawierający ten znak.
  • Wartość typu liczbowego jest konwertowana na ciąg o postaci odpowiadającego literału liczbowego. Jednak wynik nie zawiera spacji wiodących ani końcowych, nie ma znaku plusa na początku, liczby całkowite są w systemie dziesiętnym i nie ma sufiksu typu. W przypadku konwersji dziesiętnej skala jest zachowywana. W przypadku wartości -∞, +∞ i NaN wynikowe ciągi to odpowiednio "-Infinity", "Infinity" i "NaN".
  • Wartość typu null jest konwertowana na pusty ciąg.
  • W przypadku tablicy 1-wymiarowej wynik jest ciągiem zawierającym wartość każdego elementu w tej tablicy, od początku do końca, konwertowany na ciąg, z elementami oddzielonymi bieżącym separatorem pól wyjściowych (§2.3.2.2). W przypadku tablicy zawierającej same tablice są konwertowane tylko elementy najwyższego poziomu. Ciąg używany do reprezentowania wartości elementu, który jest tablicą, jest definiowany przez implementację. W przypadku tablicy wielowymiarowej jest spłaszczona (§9.12), a następnie traktowana jako tablica 1-wymiarowa.
  • Wartość typu null jest konwertowana na pusty ciąg.
  • Wartość typu scriptblock jest konwertowana na ciąg zawierający tekst tego bloku bez znaków ograniczających { i }.
  • W przypadku wartości typu wyliczenia wynik jest ciągiem zawierającym nazwę każdej stałej wyliczenia zakodowanej w tej wartości rozdzielone przecinkami.
  • W przypadku innych wartości typu odwołania, jeśli typ odwołania obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest w błędzie.

Ciąg używany do reprezentowania wartości elementu, który jest tablicą, ma postać System.type[], System.type[,]itd. W przypadku innych typów odwołań wywoływana jest metoda ToString. W przypadku innych typów wyliczalnych wartość źródłowa jest traktowana jak tablica 1-wymiarowa.

6.9 Konwersja na tablicę

Reguły konwertowania dowolnej wartości na typ tablicy są następujące:

  • Typ docelowy może nie być tablicą wielowymiarową.
  • Wartość typu null jest zachowywana w taki sposób, jak jest.
  • W przypadku wartości skalarnej innej niż $null lub wartości typu hashtable zostanie utworzona nowa 1-elementowa tablica, której wartość jest skalarną wartością po konwersji do docelowego typu elementu.
  • Dla wartości w jednowymiarowej tablicy tworzona jest nowa tablica typu docelowego i każdy element jest kopiowany z odpowiednią konwersją od elementu w tablicy źródłowej do odpowiedniego elementu w tablicy docelowej.
  • W przypadku wielowymiarowej wartości tablicy ta tablica jest najpierw spłaszczona (§9.12), a następnie traktowana jako wartość tablicy 1-wymiarowej.
  • Wartość ciągu jest konwertowana na tablicę znaków o tej samej długości, przy czym kolejne znaki ciągu zajmują odpowiadające im pozycje w tablicy.

W przypadku innych typów wyliczalnych tworzona jest nowa tablica 1-elementowa, której wartość jest odpowiednim elementem po konwersji na typ elementu docelowego, jeśli taka konwersja istnieje. W przeciwnym razie wystąpi błąd konwersji.

6.10 Konwersja na XML

Obiekt jest konwertowany na ciąg typu, a następnie do obiektu dokumentu XML typu xml.

6.11 Konwersja na wyrażenie regularne

Wyrażenie, które wyznacza wartość ciągu typu, może zostać przekonwertowane na typ regex.

6.12 Konwersja na skryptblok

Reguły konwertowania dowolnej wartości na typ scriptblock są następujące:

  • Wartość ciągu jest traktowana jako nazwa polecenia, po której opcjonalnie mogą występować argumenty do wywołania tego polecenia.

6.13 Konwersja na typy wyliczenia

Reguły konwertowania dowolnej wartości na typ wyliczenia są następujące:

  • Wartość typu string, która zawiera jedną z nazwanych wartości (z uwzględnieniem wielkości liter) dla typu wyliczeniowego, jest konwertowana na tę nazwę.
  • Wartość typu ciąg, zawierająca listę nazwanych wartości oddzielonych przecinkami z uwzględnieniem wielkości liter dla typu wyliczenia, jest konwertowana na bitową operację OR wszystkich tych nazwanych wartości.

6.14 Konwersja na inne typy referencyjne

Reguły konwertowania dowolnej wartości na typ odwołania inny niż typ tablicy lub ciąg są następujące:

  • Wartość typu null jest zachowywana w taki sposób, jak jest.
  • W przeciwnym razie zachowanie jest zależne od implementacji.

Do gry wchodzi tu wiele mechanizmów; obejmują one możliwe użycie konstruktorów pojedynczego argumentu lub konstruktorów domyślnych, jeśli wartość jest tablicą mieszającą, operatory konwersji jawnej i niejawnej oraz metody Parse dla docelowego typu; użycie Convert.ConvertTo; oraz mechanizm konwersji ETS.

6.15 Zwykłe konwersje arytmetyczne

Jeśli żaden operand nie wyznacza wartości o typie liczbowym, wówczas

  • Jeśli lewy operand wyznacza wartość typu bool, konwersja jest w błędzie.
  • W przeciwnym razie wszystkie operandy wyznaczające wartość $null są konwertowane na zero typu int, a proces kontynuuje konwersje liczbowe wymienione poniżej.
  • W przeciwnym razie, jeśli lewy operand wyznacza wartość typu char, a prawy operand wyznacza wartość typu bool, konwersja jest błędna.
  • W przeciwnym razie, jeśli lewy operand wyznacza wartość ciągu typu, ale nie reprezentuje liczby (§6.16), konwersja jest błędna.
  • W przeciwnym razie, jeśli prawy operand wyznacza wartość ciągu typu, ale nie reprezentuje liczby (§6.16), konwersja jest błędna.
  • W przeciwnym razie wszystkie operandy wyznaczające wartości ciągu typu są konwertowane na liczby (§6.16), a proces kontynuuje konwersje liczbowe wymienione poniżej.
  • W przeciwnym razie konwersja jest błędna.

Konwersje liczbowe:

  • Jeśli jeden operand wyznacza wartość typu dziesiętnego, wartość wyznaczona przez drugi operand jest konwertowana na ten typ, jeśli jest to konieczne. Wynik ma typ dziesiętny.
  • W przeciwnym razie, jeśli jeden operand wyznaczy wartość typu dwukrotnie, wartość wyznaczona przez drugi operand jest konwertowana na ten typ, jeśli jest to konieczne. Wynik ma typ double.
  • W przeciwnym razie, jeśli jeden operand wyznaczy wartość typu float, wartości wyznaczone przez oba operandy są konwertowane na typ podwójny, jeśli to konieczne. Wynik ma typ podwójny.
  • W przeciwnym razie, jeśli jeden operand wyznaczy wartość typu long, wartość wyznaczona przez inną wartość operandu jest konwertowana na ten typ, jeśli jest to konieczne. Wynik ma typ, który jako pierwszy w sekwencji jest typu long i double, mogący reprezentować jego wartość.
  • W przeciwnym razie wartości wyznaczone przez oba operandy są konwertowane na typ int, jeśli to konieczne. Wynik to pierwszy w sekwencji int, long, double, który może reprezentować jego wartość bez utraty wartości.

6.16 Konwersja z ciągu na typ liczbowy

W zależności od jego zawartości ciąg można jawnie lub niejawnie konwertować na wartość liczbową. Specyficznie

  • Pusty ciąg jest konwertowany na wartość zero.
  • Spacje wiodące i końcowe są ignorowane; jednak ciąg może nie zawierać tylko spacji.
  • Ciąg zawierający tylko białe znaki i/lub znaki końcowe wiersza jest konwertowany na wartość zero.
  • Jeden znak wiodący + lub — jest dozwolony.
  • Liczba całkowita może mieć prefiks szesnastkowy (0x lub 0X).
  • Dozwolone jest opcjonalne dodanie znaku do wykładnika.
  • Sufiksy typów i mnożniki nie są dozwolone.
  • Ciągi rozróżniające wielkość liter "-Infinity", "Infinity" i "NaN" są rozpoznawane odpowiednio jako wartości -∞, +∞ i NaN.

6.17 Konwersja podczas wiązania parametrów

Aby uzyskać informacje o powiązaniu parametrów, zobacz §8.14.

Jeśli wartość wyrażenia jest powiązana z parametrem, istnieją dodatkowe zagadnienia dotyczące konwersji, jak opisano poniżej:

  • Jeśli typ parametru jest przełącznik (§4.2.5, §8.10.5) i parametr nie ma argumentu, wartość parametru w wywołaniu polecenia jest ustawiona na $true. Jeśli typ parametru jest inny niż przełącznik, parametr bez argumentu jest w błędzie.
  • Jeśli typ parametru jest przełączony, a wartość argumentu jest $null, wartość parametru jest ustawiona na $false.
  • Jeśli typ parametru jest obiektem lub jest taki sam jak typ argumentu, wartość argumentu jest przekazywana bez konwersji.
  • Jeśli typ parametru nie jest obiektem lub scriptblock, argument o typie scriptblock jest obliczany i jego wynik jest przekazywany jako wartość argumentu. (Jest to znane jako opóźnione powiązanie bloku skryptu.) Jeśli typ parametru to obiekt lub scriptblock, argument o typie scriptblock jest przekazywany w tej samej formie.
  • Jeśli typ parametru jest kolekcją typu T2, a argument jest skalarnym typem T1, skalar jest konwertowany na kolekcję typu T2 zawierającego jeden element. W razie potrzeby wartość skalarna jest konwertowana na typ T2 przy użyciu reguł konwersji w tej sekcji.
  • Jeśli typ parametru jest typem skalarnym innym niż obiekt, a argument jest kolekcją, argument jest błędem.
  • Jeśli oczekiwany typ parametru jest kolekcją typu T2, a argument jest kolekcją typu T1, argument jest konwertowany na kolekcję typu T2 o takiej samej długości jak kolekcja argumentów. W razie potrzeby wartości elementów kolekcji argumentów są konwertowane na typ T2 przy użyciu reguł konwersji w tej sekcji.
  • Jeśli powyższe kroki i konwersje określone wcześniej w tym rozdziale nie są wystarczające, stosowane są zasady w §6.18. Jeśli te się nie powiodą, wiązanie parametru zakończy się niepowodzeniem.

Konwersja platformy .NET w wersji 6.18

W przypadku niejawnej konwersji wbudowane konwersje programu PowerShell są najpierw wypróbowane. Jeśli nie mogą rozpoznać konwersji, poniższe konwertery niestandardowe platformy .NET zostaną wypróbowane w kolejności od góry do dołu. Jeśli została znaleziona konwersja, ale wystąpił wyjątek, konwersja nie powiodła się.

  • PSTypeConverter: Istnieją dwa sposoby kojarzenia implementacji klasy PSTypeConverter z klasą docelową: za pomocą pliku konfiguracji typu (types.ps1xml) lub przez zastosowanie atrybutu System.ComponentModel.TypeConverterAttribute do klasy docelowej. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją zestawu PowerShell SDK.

  • TypeConverter: ten typ CLR zapewnia ujednolicony sposób konwertowania typów wartości na inne typy, a także uzyskiwania dostępu do wartości standardowych i właściwości podrzędnych. Najbardziej typowym typem konwertera jest ten, który konwertuje na i z reprezentacji tekstu. Konwerter typów dla danej klasy jest powiązany z tą klasą przy użyciu System.ComponentModel.TypeConverterAttribute. Jeśli ten atrybut nie zostanie zastąpiony, wszystkie klasy dziedziczone z tej klasy używają tego samego konwertera typów co klasa bazowa. Aby uzyskać więcej informacji, zobacz zestaw SDK programu PowerShell i dokumentację platformy Microsoft .NET Framework.

  • Parse Method: Jeśli typ źródłowy jest ciągiem, a typ docelowy ma metodę o nazwie Parse, ta metoda jest wywoływana w celu przeprowadzenia konwersji.

  • Konstruktory: Jeśli typ docelowy ma konstruktor przyjmujący pojedynczy argument, którego typ odpowiada typowi źródłowemu, ten konstruktor jest wywoływany do konwersji.

  • Niejawny operator rzutowania: jeśli typ źródłowy ma niejawny operator rzutowania, który konwertuje na typ docelowy, ten operator jest wywoływany w celu przeprowadzenia konwersji.

  • Jawny operator rzutowania: jeśli typ źródła ma jawny operator rzutowania, który konwertuje na typ docelowy, to ten operator rzutowania jest wywoływany w celu przeprowadzenia konwersji. Jeśli typ docelowy ma jawny operator rzutowania, który konwertuje z typu źródłowego, ten operator jest wywoływany w celu przeprowadzenia konwersji.

  • IConvertable: System.Convert.ChangeType jest wywoływane w celu przeprowadzenia konwersji.

6.19 Konwersja na uporządkowaną

Reguły konwertowania dowolnej wartości na pseudo-typ uporządkowany są następujące:

  • Jeśli wartość jest literałem skrótu (§2.3.5.6), wynik jest obiektem o zdefiniowanym typie implementacji, który zachowuje się jak tabela skrótu, a kolejność kluczy pasuje do kolejności określonej w literału skrótu.
  • W przeciwnym razie zachowanie jest zdefiniowane przez implementację.

Tylko literały haszujące (§2.3.5.6) mogą być przekonwertowane na uporządkowane. Wynikiem jest wystąpienie System.Collections.Specialized.OrderedDictionary.

6.20 Konwersja na pscustomobject

Reguły konwertowania dowolnej wartości na pseudotyp pscustomobject są następujące:

  • Wartość tabeli skrótu typu jest konwertowana na obiekt programu PowerShell. Każdy klucz w tabeli skrótu staje się właściwością typu NoteProperty z odpowiednią wartością.
  • W przeciwnym razie zachowanie zależy od konkretnej implementacji.

Konwersja jest zawsze dozwolona, ale nie zmienia typu wartości.