PowerShell
Работа с объектами
Поиск…
Обновление объектов
Добавление свойств
Если вы хотите добавить свойства к существующему объекту, вы можете использовать командлет Add-Member. С помощью PSObjects значения хранятся в виде «Свойства примечания»,
$object = New-Object -TypeName PSObject -Property @{
Name = $env:username
ID = 12
Address = $null
}
Add-Member -InputObject $object -Name "SomeNewProp" -Value "A value" -MemberType NoteProperty
# Returns
PS> $Object
Name ID Address SomeNewProp
---- -- ------- -----------
nem 12 A value
Вы также можете добавлять свойства с помощью Select-Object Cmdlet (так называемые рассчитанные свойства):
$newObject = $Object | Select-Object *, @{label='SomeOtherProp'; expression={'Another value'}}
# Returns
PS> $newObject
Name ID Address SomeNewProp SomeOtherProp
---- -- ------- ----------- -------------
nem 12 A value Another value
Вышеуказанная команда может быть сокращена до следующего:
$newObject = $Object | Select *,@{l='SomeOtherProp';e={'Another value'}}
Удаление свойств
Командлет Select-Object можно использовать для удаления свойств объекта:
$object = $newObject | Select-Object * -ExcludeProperty ID, Address
# Returns
PS> $object
Name SomeNewProp SomeOtherProp
---- ----------- -------------
nem A value Another value
Создание нового объекта
PowerShell, в отличие от некоторых других языков сценариев, отправляет объекты по конвейеру. Это означает, что при отправке данных из одной команды в другую важно иметь возможность создавать, изменять и собирать объекты.
Создание объекта просто. Большинство объектов, которые вы создаете, будут настраиваемыми объектами в PowerShell, а типом для этого является PSObject. PowerShell также позволит вам создать любой объект, который вы могли бы создать в .NET.
Вот пример создания новых объектов с несколькими свойствами:
Вариант 1: Новый объект
$newObject = New-Object -TypeName PSObject -Property @{
Name = $env:username
ID = 12
Address = $null
}
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Вы можете сохранить объект в переменной, предварительно $newObject =
команду с помощью $newObject =
Вам также может потребоваться хранить коллекции объектов. Это можно сделать, создав пустую коллекционную переменную и добавив объекты в коллекцию, например:
$newCollection = @()
$newCollection += New-Object -TypeName PSObject -Property @{
Name = $env:username
ID = 12
Address = $null
}
Затем вы можете запрограммировать этот объект коллекции по объекту. Для этого найдите раздел Loop в документации.
Вариант 2: Select-Object
Менее распространенным способом создания объектов, которые вы все равно найдете в Интернете, является следующее:
$newObject = 'unuseddummy' | Select-Object -Property Name, ID, Address
$newObject.Name = $env:username
$newObject.ID = 12
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Вариант 3: ускоритель типа pscustomobject (требуется PSv3 +)
Ускоритель упорядоченного типа заставляет PowerShell сохранять наши свойства в том порядке, в котором мы их определяли. Вам не нужен ускоритель упорядоченного типа для использования [PSCustomObject]
:
$newObject = [PSCustomObject][Ordered]@{
Name = $env:Username
ID = 12
Address = $null
}
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Изучение объекта
Теперь, когда у вас есть объект, может быть полезно выяснить, что это такое. Командлет Get-Member можно использовать, чтобы узнать, что такое объект и что он содержит:
Get-Item c:\windows | Get-Member
Это дает:
TypeName: System.IO.DirectoryInfo
Далее следует список свойств и методов, которыми обладает объект.
Другой способ получить тип объекта - использовать метод GetType, например:
C:\> $Object = Get-Item C:\Windows
C:\> $Object.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DirectoryInfo System.IO.FileSystemInfo
Чтобы просмотреть список свойств, которые имеет объект, вместе с их значениями, вы можете использовать командлет Format-List с его параметром Property, установленным на: * (что означает все).
Вот пример, с результатом:
C:\> Get-Item C:\Windows | Format-List -Property *
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Windows
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName : Windows
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : True
Mode : d-----
BaseName : Windows
Target : {}
LinkType :
Name : Windows
Parent :
Exists : True
Root : C:\
FullName : C:\Windows
Extension :
CreationTime : 30/10/2015 06:28:30
CreationTimeUtc : 30/10/2015 06:28:30
LastAccessTime : 16/08/2016 17:32:04
LastAccessTimeUtc : 16/08/2016 16:32:04
LastWriteTime : 16/08/2016 17:32:04
LastWriteTimeUtc : 16/08/2016 16:32:04
Attributes : Directory
Создание экземпляров общих классов
Примечание: примеры, написанные для PowerShell 5.1. Вы можете создавать экземпляры общих классов
#Nullable System.DateTime
[Nullable[datetime]]$nullableDate = Get-Date -Year 2012
$nullableDate
$nullableDate.GetType().FullName
$nullableDate = $null
$nullableDate
#Normal System.DateTime
[datetime]$aDate = Get-Date -Year 2013
$aDate
$aDate.GetType().FullName
$aDate = $null #Throws exception when PowerShell attempts to convert null to
Выдает вывод:
Saturday, 4 August 2012 08:53:02
System.DateTime
Sunday, 4 August 2013 08:53:02
System.DateTime
Cannot convert null to type "System.DateTime".
At line:14 char:1
+ $aDate = $null
+ ~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
Также возможны общие коллекции
[System.Collections.Generic.SortedDictionary[int, String]]$dict = [System.Collections.Generic.SortedDictionary[int, String]]::new()
$dict.GetType().FullName
$dict.Add(1, 'a')
$dict.Add(2, 'b')
$dict.Add(3, 'c')
$dict.Add('4', 'd') #powershell auto converts '4' to 4
$dict.Add('5.1', 'c') #powershell auto converts '5.1' to 5
$dict
$dict.Add('z', 'z') #powershell can't convert 'z' to System.Int32 so it throws an error
Выдает вывод:
System.Collections.Generic.SortedDictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Key Value
--- -----
1 a
2 b
3 c
4 d
5 c
Cannot convert argument "key", with value: "z", for "Add" to type "System.Int32": "Cannot convert value "z" to type "System.Int32". Error: "Input string was not in a correct format.""
At line:15 char:1
+ $dict.Add('z', 'z') #powershell can't convert 'z' to System.Int32 so ...
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument