about_Type_Operators

Krótki opis

Opisuje operatory współpracujące z typami microsoft .NET.

Długi opis

Operatory typu logicznego (-is i -isnot) informują, czy obiekt jest wystąpieniem określonego typu .NET. Operator -is zwraca wartość TRUE , jeśli typ jest zgodny i wartość FALSE w przeciwnym razie. Operator -isnot zwraca wartość FALSE , jeśli typ jest zgodny i wartość TRUE w przeciwnym razie.

Operator -as próbuje przekonwertować obiekt wejściowy na określony typ platformy .NET. Jeśli to się powiedzie, zwraca przekonwertowany obiekt. Jeśli zakończy się to niepowodzeniem, zwraca wartość $null. Nie zwraca błędu.

Program PowerShell ma następujące operatory typów:

  • -is |Zwraca wartość TRUE, gdy dane wejściowe są wystąpieniem określonego typu .NET.

    (get-date) -is [DateTime]     # Result is True
    
  • -isnot|Zwraca wartość TRUE, gdy dane wejściowe nie są wystąpieniem typu specified.NET.

    (get-date) -isnot [DateTime]  # Result is False
    
  • -as |Konwertuje dane wejściowe na określony typ platformy .NET.

    "5/7/07" -as [DateTime]       # Result is Monday, May 7, 2007 12:00:00 AM
    

Składnia operatorów typów jest następująca:

<input> <operator> [.NET type]

Można również użyć następującej składni:

<input> <operator> ".NET type"

Typ platformy .NET można zapisać jako nazwę typu w nawiasach kwadratowych lub ciągach, takich jak [DateTime] lub "DateTime" dla elementu System.DateTime. Jeśli typ nie znajduje się w katalogu głównym przestrzeni nazw systemu, określ pełną nazwę typu obiektu. Można pominąć "System.". Aby na przykład określić parametr System.Diagnostics.Process, wprowadź , [Diagnostics.Process][System.Diagnostics.Process]lub "Diagnostics.Process".

Operatory typów zawsze działają na obiekcie wejściowym jako całości. Oznacza to, że jeśli obiekt wejściowy jest kolekcją, jest to typ kolekcji, który jest testowany, a nie typy elementów kolekcji.

-is/isnot, operatory

Operatory typu logicznego (-is i -isnot) zawsze zwracają wartość logiczną, nawet jeśli dane wejściowe są kolekcją obiektów.

Jeśli <input> jest typem, który jest taki sam jak lub pochodzi z typu platformy .NET, -is operator zwraca wartość $True.

Na przykład typ DirectoryInfo pochodzi z typu FileSystemInfo . W związku z tym oba te przykłady zwracają wartość True.

PS> (Get-Item /) -is [System.IO.DirectoryInfo]
True
PS> (Get-Item /) -is [System.IO.FileSystemInfo]
True

Operator -is może również dopasować interfejsy, jeśli <input> implementuje interfejs w porównaniu. W tym przykładzie dane wejściowe są tablicą. Tablice implementują interfejs System.Collections.IList .

PS> 1, 2 -is [System.Collections.IList]
True

-as Operator

Operator -as próbuje przekonwertować obiekt wejściowy na określony typ platformy .NET. Jeśli to się powiedzie, zwraca przekonwertowany obiekt. Jeśli zakończy się niepowodzeniem, zwraca wartość $null. Nie zwraca błędu.

<input> Jeśli element jest typem pochodzącym z typu-as platformy .NET, zwraca obiekt wejściowy bez zmian. Na przykład typ DirectoryInfo pochodzi z typu FileSystemInfo . W związku z tym typ obiektu jest niezmieniony w poniższym przykładzie:

PS> $fsroot = (Get-Item /) -as [System.IO.FileSystemInfo]
PS> $fsroot.GetType().FullName
System.IO.DirectoryInfo

Konwertowanie typu DateTime jest wrażliwe na kulturę

W przeciwieństwie do rzutowania typów konwertowanie na [DateTime] typ przy użyciu -as operatora działa tylko z ciągami sformatowanymi zgodnie z regułami bieżącej kultury.

PS> [cultureinfo]::CurrentCulture = 'fr-FR'
PS> '13/5/20' -as [datetime]

mercredi 13 mai 2020 00:00:00

PS> '05/13/20' -as [datetime]
PS> [datetime]'05/13/20'

mercredi 13 mai 2020 00:00:00

PS> [datetime]'13/05/20'
InvalidArgument: Cannot convert value "13/05/20" to type "System.DateTime".
Error: "String '13/05/20' was not recognized as a valid DateTime."

Aby znaleźć typ .NET obiektu, użyj Get-Member polecenia cmdlet . Możesz też użyć metody GetType wszystkich obiektów wraz z właściwością FullName tej metody. Na przykład następująca instrukcja pobiera typ zwracanej wartości Get-Culture polecenia:

PS> (Get-Culture).GetType().FullName
System.Globalization.CultureInfo

Przykłady

W poniższych przykładach przedstawiono niektóre zastosowania operatorów typu:

PS> 32 -is [Float]
False

PS> 32 -is "int"
True

PS> (get-date) -is [DateTime]
True

PS> "12/31/2007" -is [DateTime]
False

PS> "12/31/2007" -is [String]
True

PS> (get-process PowerShell)[0] -is [System.Diagnostics.Process]
True

PS> (get-command get-member) -is [System.Management.Automation.CmdletInfo]
True

W poniższym przykładzie pokazano, że gdy dane wejściowe są kolekcją obiektów, pasujący typ jest typem kolekcji .NET, a nie typem poszczególnych obiektów w kolekcji.

W tym przykładzie Get-Culture polecenia cmdlet i Get-UICulture zwracają obiekty System.Globalization.CultureInfo , ale kolekcja tych obiektów jest tablicą System.Object.

PS> (get-culture) -is [System.Globalization.CultureInfo]
True

PS> (get-uiculture) -is [System.Globalization.CultureInfo]
True

PS> (get-culture), (get-uiculture) -is [System.Globalization.CultureInfo]
False

PS> (get-culture), (get-uiculture) -is [Array]
True

PS> (get-culture), (get-uiculture) | foreach {
  $_ -is [System.Globalization.CultureInfo])
}
True
True

PS> (get-culture), (get-uiculture) -is [Object]
True

W poniższych przykładach pokazano, jak używać -as operatora .

PS> "12/31/07" -is [DateTime]
False

PS> "12/31/07" -as [DateTime]
Monday, December 31, 2007 12:00:00 AM

PS> $date = "12/31/07" -as [DateTime]

C:\PS>$a -is [DateTime]
True

PS> 1031 -as [System.Globalization.CultureInfo]

LCID      Name      DisplayName
----      ----      -----------
1031      de-DE     German (Germany)

Poniższy przykład pokazuje, że gdy -as operator nie może przekonwertować obiektu wejściowego na typ platformy .NET, zwraca wartość $null.

PS> 1031 -as [System.Diagnostics.Process]
PS>

Zobacz też