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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow