about_Object_Creation
Kurze Beschreibung
Erläutert, wie Objekte in PowerShell erstellt werden.
Lange Beschreibung
Sie können Objekte in PowerShell erstellen und die Objekte verwenden, die Sie in Befehlen und Skripts erstellen.
Es gibt viele Möglichkeiten zum Erstellen von Objekten, diese Liste ist nicht endgültig:
- New-Object: Erstellt eine Instanz eines .NET Framework-Objekts oder COM-Objekts.
- Import-Csv/ConvertFrom-CSV: Erstellt benutzerdefinierte Objekte (PSCustomObject) aus den Elementen, die als zeichentrennte Werte definiert sind.
- ConvertFrom-Json: Erstellt benutzerdefinierte Objekte, die in JavaScript Object Notation (JSON) definiert sind.
- ConvertFrom-StringData: Erstellt benutzerdefinierte Objekte, die als Schlüsselwertpaare definiert sind.
- Add-Type: Ermöglicht ihnen, eine Klasse in Ihrer PowerShell-Sitzung zu definieren, mit
New-Object
der Sie instanziieren können. - New-Module: Der AsCustomObject-Parameter erstellt ein benutzerdefiniertes Objekt, das Sie mithilfe des Skriptblocks definieren.
- Add-Member: Fügt vorhandenen Objekten Eigenschaften hinzu. Sie können
Add-Member
ein benutzerdefiniertes Objekt aus einem einfachen Typ erstellen, z[System.Int32]
. B. . - Select-Object: Wählt Eigenschaften für ein Objekt aus. Sie können benutzerdefinierte
Select-Object
und berechnete Eigenschaften für ein bereits instanziiertes Objekt erstellen.
Die folgenden zusätzlichen Methoden werden in diesem Artikel behandelt:
- Durch Aufrufen des Konstruktors eines Typs mithilfe einer statischen
new()
Methode - Nach typecasting hash tables of property names and property values
Static new() method
Alle .NET-Typen verfügen über eine new()
Methode, mit der Sie Instanzen einfacher erstellen können. Sie können auch alle verfügbaren Konstruktoren für einen bestimmten Typ anzeigen.
Um die Konstruktoren für einen Typ anzuzeigen, geben Sie den new
Methodennamen nach dem Typnamen an, und drücken Sie .<ENTER>
[System.Uri]::new
OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)
Jetzt können Sie einen System.Uri erstellen, indem Sie den entsprechenden Konstruktor angeben.
[System.Uri]::new("https://www.bing.com")
AbsolutePath : /
AbsoluteUri : https://www.bing.com/
LocalPath : /
Authority : www.bing.com
...
Sie können das folgende Beispiel verwenden, um zu bestimmen, welche .NET-Typen zurzeit geladen werden, damit Sie instanziieren können.
[AppDomain]::CurrentDomain.GetAssemblies() |
ForEach-Object {
$_.GetExportedTypes() |
ForEach-Object { $_.FullName }
}
Objekte, die mit der new()
Methode erstellt wurden, weisen möglicherweise nicht dieselben Eigenschaften wie Objekte desselben Typs auf, die von PowerShell-Cmdlets erstellt werden. PowerShell-Cmdlets, -Anbieter und "Extended Type System" können der Instanz zusätzliche Eigenschaften hinzufügen.
Der FileSystem-Anbieter in PowerShell fügt z. B. sechs NoteProperty-Werte zum directoryInfo-Objekt hinzu, das von Get-Item
.
$PSDirInfo = Get-Item /
$PSDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
4 CodeProperty
13 Property
6 NoteProperty
1 ScriptProperty
18 Method
Wenn Sie ein DirectoryInfo-Objekt direkt erstellen, enthält es diese sechs NoteProperty-Werte nicht.
$NewDirInfo = [System.IO.DirectoryInfo]::new('/')
$NewDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
4 CodeProperty
13 Property
1 ScriptProperty
18 Method
Weitere Informationen zum erweiterten Typsystem finden Sie unter about_Types.ps1xml.
Dieses Feature wurde in PowerShell 5.0 hinzugefügt.
Erstellen von Objekten aus Hashtabellen
Sie können ein Objekt aus einer Hashtabelle mit Eigenschaften und Eigenschaftswerten erstellen.
Die Syntax lautet wie folgt:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Diese Methode funktioniert nur für Klassen, die über einen parameterlosen Konstruktor verfügen. Die Objekteigenschaften müssen öffentlich und festgelegt sein.
Dieses Feature wurde in PowerShell, Version 3.0, hinzugefügt.
Erstellen benutzerdefinierter Objekte aus Hashtabellen
Benutzerdefinierte Objekte sind sehr nützlich und können einfach mithilfe der Hashtabellenmethode erstellt werden. Die PSCustomObject-Klasse wurde speziell für diesen Zweck entwickelt.
Benutzerdefinierte Objekte sind eine hervorragende Möglichkeit, benutzerdefinierte Ausgabe aus einer Funktion oder einem Skript zurückzugeben. Dies ist nützlicher als das Zurückgeben formatierter Ausgaben, die nicht neu formatiert oder an andere Befehle weitergeleitet werden können.
Die Befehle in der Test-Object function
Gruppe legen einige Variablenwerte fest und verwenden dann diese Werte, um ein benutzerdefiniertes Objekt zu erstellen. Dieses Objekt wird im Beispielabschnitt des Hilfethemas des Update-Help
Cmdlets verwendet.
function Test-Object {
$ModuleName = "PSScheduledJob"
$HelpCulture = "en-us"
$HelpVersion = "3.1.0.0"
[PSCustomObject]@{
"ModuleName"=$ModuleName
"UICulture"=$HelpCulture
"Version"=$HelpVersion
}
$ModuleName = "PSWorkflow"
$HelpCulture = "en-us"
$HelpVersion = "3.0.0.0"
[PSCustomObject]@{
"ModuleName"=$ModuleName
"UICulture"=$HelpCulture
"Version"=$HelpVersion
}
}
Test-Object
Die Ausgabe dieser Funktion ist eine Auflistung von benutzerdefinierten Objekten, die standardmäßig als Tabelle formatiert sind.
ModuleName UICulture Version
--------- --------- -------
PSScheduledJob en-us 3.1.0.0
PSWorkflow en-us 3.0.0.0
Benutzer können die Eigenschaften der benutzerdefinierten Objekte genauso wie bei Standardobjekten verwalten.
(Test-Object).ModuleName
PSScheduledJob
PSWorkflow
PSObject-Typobjekte verwalten die Liste der Member in der Reihenfolge, in der die Elemente dem Objekt hinzugefügt wurden. Obwohl Hashtable-Objekte die Reihenfolge der Schlüsselwertpaare nicht garantieren, wird eine Literalhashtable in [pscustomobject]
die Reihenfolge umgewandt.
Die Hashtabelle muss ein Literal sein. Wenn Sie die Hashtable in Klammern umschließen oder eine Variable umwandeln, die eine Hashtabelle enthält, besteht keine Garantie dafür, dass die Reihenfolge beibehalten wird.
$hash = @{
Name = "Server30"
System = "Server Core"
PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System Name PSVersion
------ ---- ---------
Server Core Server30 4.0
Erstellen von nicht benutzerdefinierten Objekten aus Hashtabellen
Sie können auch Hashtabellen verwenden, um Objekte für nicht benutzerdefinierte Klassen zu erstellen. Wenn Sie ein Objekt für eine nicht benutzerdefinierte Klasse erstellen, ist der namespacequalifizierte Typname erforderlich, obwohl Sie möglicherweise eine anfängliche Systemnamespacekomponente weglassen.
Mit dem folgenden Befehl wird beispielsweise ein Sitzungsoptionsobjekt erstellt.
[System.Management.Automation.Remoting.PSSessionOption]@{
IdleTimeout=43200000
SkipCnCheck=$True
}
Die Anforderungen des Hashtabellenfeatures, insbesondere die parameterlose Konstruktoranforderung, beseitigen viele vorhandene Klassen. Die meisten PowerShell-Optionsklassen sind jedoch so konzipiert, dass sie mit diesem Feature arbeiten, sowie andere sehr nützliche Klassen, z. B. die ProcessStartInfo-Klasse.
[System.Diagnostics.ProcessStartInfo]@{
CreateNoWindow="$true"
Verb="run as"
}
Arguments :
ArgumentList : {}
CreateNoWindow : True
EnvironmentVariables : {OneDriveConsumer, PROCESSOR_ARCHITECTURE,
CommonProgramFiles(x86), APPDATA...}
Environment : {[OneDriveConsumer, C:\Users\user1\OneDrive],
[PROCESSOR_ARCHITECTURE, AMD64],
[CommonProgramFiles(x86),
C:\Program Files (x86)\Common Files],
[APPDATA, C:\Users\user1\AppData\Roaming]...}
RedirectStandardInput : False
RedirectStandardOutput : False
RedirectStandardError : False
...
Sie können auch das Hashtabellenfeature verwenden, wenn Sie Parameterwerte festlegen. Der Wert des SessionOption-Parameters der New-PSSession
.
Cmdlet kann eine Hashtabelle sein.
New-PSSession -ComputerName Server01 -SessionOption @{
IdleTimeout=43200000
SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
Frequency="Daily"
At="15:00"
}
Generische Objekte
Sie können auch generische Objekte in PowerShell erstellen. Generics sind Klassen, Strukturen, Schnittstellen und Methoden, die über Platzhalter (Typparameter) für einen oder mehrere der Typen verfügen, die sie speichern oder verwenden.
Im folgenden Beispiel wird ein Dictionary-Objekt erstellt.
$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One 1
Weitere Informationen zu Generics finden Sie unter Generics in .NET.