about_Object_Creation

Kurze Beschreibung

Erläutert, wie Sie Objekte in PowerShell erstellen.

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 durch Trennzeichen getrennte Werte definiert sind.
  • ConvertFrom-Json: Erstellt benutzerdefinierte Objekte, die in JavaScript-Objektnotation (JSON) definiert sind.
  • ConvertFrom-StringData: Erstellt benutzerdefinierte Objekte, die als Schlüsselwertpaare definiert sind.
  • Add-Type: Ermöglicht Es Ihnen, eine Klasse in Ihrer PowerShell-Sitzung zu definieren, mit der Sie Instanziieren New-Objectkö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 ein Add-Member 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 Typcasting-Hashtabellen von Eigenschaftsnamen und Eigenschaftswerten

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 derzeit geladen werden, damit Sie Instanziieren können.

[AppDomain]::CurrentDomain.GetAssemblies() |
  ForEach-Object {
    $_.GetExportedTypes() |
      ForEach-Object { $_.FullName }
  }

Objekte, die mit der new() Methode erstellt wurden, verfügen möglicherweise nicht über dieselben Eigenschaften wie Objekte desselben Typs, die von PowerShell-Cmdlets erstellt werden. PowerShell-Cmdlets, Anbieter und erweitertes Typsystem können der Instanz zusätzliche Eigenschaften hinzufügen.

Der FileSystem-Anbieter in PowerShell fügt z. B. sechs NoteProperty-Werte zum von diesem zurückgegebenen Get-ItemDirectoryInfo-Objekt hinzu.

$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, verfügt es nicht über diese sechs NoteProperty-Werte .

$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 Eigenschaftenwerten erstellen.

Die Syntax ist wie folgt:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Diese Methode funktioniert nur für Klassen mit einem parameterlosen Konstruktor. 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, die angepasste Ausgabe aus einer Funktion oder einem Skript zurückzugeben. Dies ist nützlicher als die Rückgabe formatierter Ausgabe, die nicht neu formatiert oder an andere Befehle weitergeleitet werden kann.

Die Befehle in den Test-Object function festgelegten Variablenwerten und verwenden dann diese Werte, um ein benutzerdefiniertes Objekt zu erstellen. Dieses Objekt wird im Beispielabschnitt des Update-Help Cmdlet-Hilfethemas 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

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 Name des namespacequalifizierten Typs erforderlich, obwohl Sie möglicherweise eine beliebige anfängliche Systemnamespacekomponente weglassen können.

Der folgende Befehl erstellt beispielsweise ein Sitzungsoptionsobjekt.

[System.Management.Automation.Remoting.PSSessionOption]@{
  IdleTimeout=43200000
  SkipCnCheck=$True
}

Die Anforderungen des Hashtabellenfeatures, insbesondere der parameterlose Konstruktoranforderung, beseitigen viele vorhandene Klassen. Die meisten PowerShell-Optionsklassen sind jedoch für die Arbeit mit diesem Feature sowie für andere sehr nützliche Klassen konzipiert, 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 des 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.

Siehe auch