об операторах типа
Краткое описание
Описывает операторы, работающие с типами 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, если входные данные не являются экземпляром указанного типа .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.Diagnostics.Process, введите [System.Diagnostics.Process]
, [Diagnostics.Process]
или "Диагностика.Процесс"
.
Операторы типа всегда работают с входным объектом целиком. То есть, если входной объект является коллекцией, тестируется тип коллекции, а не типы элементов коллекции.
-есть/не операторы
Операторы типа Boolean (-is
и -isnot
) всегда возвращают значение Boolean, даже если входные данные коллекция объектов.
Если <input>
— это тип, который совпадает с типом .NET или производен от него, оператор -is
возвращает $Истина
.
Например, тип DirectoryInfo является производным от типа FileSystemInfo. Таким образом, оба этих примера возвращают True.
PS> (Get-Item /) -is [System.IO.DirectoryInfo]
True
PS> (Get-Item /) -is [System.IO.FileSystemInfo]
True
Оператор -is
также может сопоставлять интерфейсы, если <input>
реализует интерфейс в сравнении. В этом примере входными данными является массив. Массивы реализуют интерфейс System.Collections.IList.
PS> 1, 2 -is [System.Collections.IList]
True
-как оператор
Оператор -as
пытается преобразовать входной объект в указанный тип .NET. В случае успеха возвращается преобразованный объект. В случае неудачи он возвращает $null
. Он не возвращает ошибку.
Если <input>
является типом, производным от типа .NET, -as
, проходит через, возвращает ввод объект без изменений. Например, тип 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
Примеры
В следующих примерах показаны некоторые варианты использования операторов типа:
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>
См. также
- about_Operators