about_Type_Operators

Краткое описание

Описывает операторы, работающие с типами Microsoft .NET.

Подробное описание

Логические операторы типов (-is и -isnot) указывают, является ли объект экземпляром указанного типа .NET. Оператор -is возвращает значение TRUE, если тип совпадает с значением FALSE в противном случае. Оператор -isnot возвращает значение FALSE , если тип совпадает и значение TRUE в противном случае.

Оператор -as пытается преобразовать входной объект в указанный тип .NET. Если он успешно выполнен, он возвращает преобразованный объект. В противном случае возвращается $null. Он не возвращает ошибку.

PowerShell имеет следующие операторы типов:

  • -is |Возвращает значение TRUE, если входные данные являются экземпляром указанного типа .NET.

    (get-date) -is [DateTime]     # Result is True
    
  • -isnot|Возвращает значение TRUE, если входные данные не экземпляр типа specified.NET.

    (get-date) -isnot [DateTime]  # Result is False
    
  • -as |Преобразует входные данные в указанный тип .NET.

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

Синтаксис операторов типа выглядит следующим образом:

<input> <operator> [.NET type]

Можно также использовать следующий синтаксис:

<input> <operator> ".NET type"

Тип .NET можно записать в виде имени типа в скобках или строке, например [DateTime]"DateTime"System.DateTime. Если тип не находится в корне пространства имен системы, укажите полное имя типа объекта. Вы можете опустить "System.". Например, чтобы указать System.Diagnostics.Process, введите [Diagnostics.Process][System.Diagnostics.Process]или"Diagnostics.Process".

Операторы типов всегда работают с входным объектом в целом. То есть, если входной объект является коллекцией, это тип коллекции, который тестируется, а не типы элементов коллекции.

Операторы -is/isot

Логические операторы типов (-isи-isnot) всегда возвращают логическое значение, даже если входные данные являются коллекцией объектов.

Если <input> это тип, который совпадает или является производным от типа .NET, -is оператор возвращается $True.

Например, тип DirectoryInfo является производным от типа FileSystemInfo . Поэтому оба этих примера возвращают значение True.

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

Оператор также может соответствовать интерфейсам, если <input> он -is реализует интерфейс в сравнении. В этом примере входные данные являются массивом. Массивы реализуют интерфейс System.Collections.IList .

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

Оператор -as

Оператор -as пытается преобразовать входной объект в указанный тип .NET. Если он успешно выполнен, он возвращает преобразованный объект. При сбое возвращается $null. Он не возвращает ошибку.

<input> Если тип, производный от типа -as.NET, передается через входной объект без изменений. Например, тип DirectoryInfo является производным от типа FileSystemInfo . Поэтому тип объекта не изменяется в следующем примере:

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

Преобразование типа DateTime учитывает язык и региональные параметры

В отличие от приведения типов, преобразование в [DateTime] тип с помощью -as оператора работает только со строками, отформатированными в соответствии с правилами текущего языка и региональных параметров.

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

Чтобы найти тип объекта .NET, используйте Get-Member командлет. Или используйте метод GetType всех объектов вместе со свойством FullName этого метода. Например, следующая инструкция получает тип возвращаемого Get-Culture значения команды:

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

Примеры

В следующих примерах показаны некоторые виды использования операторов Type:

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

В следующем примере показано, что если входные данные являются коллекцией объектов, соответствующий тип является типом коллекции .NET, а не типом отдельных объектов в коллекции.

В этом примере, хотя Get-Culture и Get-UICulture командлеты возвращают объекты System.Globalization.CultureInfo , коллекция этих объектов представляет собой массив 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

В следующих примерах показано, как использовать -as оператор.

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)

В следующем примере показано, что если -as оператор не может преобразовать входной объект в тип .NET, он возвращается $null.

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

См. также