PowerShell
Mit Objekten arbeiten
Suche…
Objekte aktualisieren
Eigenschaften hinzufügen
Wenn Sie einem vorhandenen Objekt Eigenschaften hinzufügen möchten, können Sie das Cmdlet Add-Member verwenden. Bei PSObjects werden Werte in einer Art "Noteneigenschaften" gespeichert.
$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
Sie können mit Select-Object-Cmdlet auch Eigenschaften hinzufügen (sogenannte berechnete Eigenschaften):
$newObject = $Object | Select-Object *, @{label='SomeOtherProp'; expression={'Another value'}}
# Returns
PS> $newObject
Name ID Address SomeNewProp SomeOtherProp
---- -- ------- ----------- -------------
nem 12 A value Another value
Der obige Befehl kann folgendermaßen verkürzt werden:
$newObject = $Object | Select *,@{l='SomeOtherProp';e={'Another value'}}
Eigenschaften entfernen
Mit dem Select-Object-Cmdlet können Sie Eigenschaften aus einem Objekt entfernen:
$object = $newObject | Select-Object * -ExcludeProperty ID, Address
# Returns
PS> $object
Name SomeNewProp SomeOtherProp
---- ----------- -------------
nem A value Another value
Ein neues Objekt erstellen
Im Gegensatz zu anderen Skriptsprachen sendet PowerShell Objekte durch die Pipeline. Dies bedeutet, dass es beim Senden von Daten von einem Befehl an einen anderen wichtig ist, Objekte erstellen, ändern und sammeln zu können.
Ein Objekt zu erstellen ist einfach. Bei den meisten von Ihnen erstellten Objekten handelt es sich um benutzerdefinierte Objekte in PowerShell. Der zu verwendende Typ ist PSObject. In PowerShell können Sie auch alle Objekte erstellen, die Sie in .NET erstellen könnten.
Hier ein Beispiel zum Erstellen neuer Objekte mit einigen Eigenschaften:
Option 1: Neues Objekt
$newObject = New-Object -TypeName PSObject -Property @{
Name = $env:username
ID = 12
Address = $null
}
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Sie können das Objekt in einer Variablen speichern, indem Sie dem Befehl $newObject =
Möglicherweise müssen Sie auch Sammlungen von Objekten speichern. Dazu können Sie eine leere Sammlungsvariable erstellen und der Sammlung Objekte hinzufügen.
$newCollection = @()
$newCollection += New-Object -TypeName PSObject -Property @{
Name = $env:username
ID = 12
Address = $null
}
Sie können dann dieses Sammlungsobjekt nach Objekt durchlaufen. Suchen Sie dazu den Loop-Abschnitt in der Dokumentation.
Option 2: Auswahlobjekt
Eine weniger gebräuchliche Methode zum Erstellen von Objekten, die Sie noch im Internet finden, ist die folgende:
$newObject = 'unuseddummy' | Select-Object -Property Name, ID, Address
$newObject.Name = $env:username
$newObject.ID = 12
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Option 3: pscustomobject-Beschleuniger (PSv3 + erforderlich)
Der bestellte Beschleuniger zwingt PowerShell dazu, unsere Eigenschaften in der von uns definierten Reihenfolge zu halten. Sie benötigen den bestellten Typ-Beschleuniger nicht, um [PSCustomObject]
:
$newObject = [PSCustomObject][Ordered]@{
Name = $env:Username
ID = 12
Address = $null
}
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Objekt untersuchen
Nun, da Sie ein Objekt haben, kann es gut sein, herauszufinden, was es ist. Mit dem Cmdlet Get-Member können Sie sehen, was ein Objekt ist und was es enthält:
Get-Item c:\windows | Get-Member
Dies ergibt:
TypeName: System.IO.DirectoryInfo
Gefolgt von einer Liste von Eigenschaften und Methoden des Objekts.
Eine andere Möglichkeit, den Typ eines Objekts abzurufen, ist die Verwendung der GetType-Methode.
C:\> $Object = Get-Item C:\Windows
C:\> $Object.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DirectoryInfo System.IO.FileSystemInfo
Um eine Liste der Eigenschaften anzuzeigen, die das Objekt zusammen mit seinen Werten besitzt, können Sie das Cmdlet Format-List mit dem Parameter Property verwenden, der auf * gesetzt ist.
Hier ist ein Beispiel mit der resultierenden Ausgabe:
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
Instanzen generischer Klassen erstellen
Hinweis: Für PowerShell 5.1 geschriebene Beispiele Sie können Instanzen generischer Klassen erstellen
#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
Gibt die Ausgabe aus:
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
Generische Sammlungen sind ebenfalls möglich
[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
Gibt die Ausgabe aus:
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