Freigeben über


about_Object_Creation

Kurze Beschreibung

Erläutert, wie Objekte in PowerShell erstellt werden.

Lange Beschreibung

Sie können Objekte in PowerShell erstellen und die Von Ihnen erstellten Objekte in Befehlen und Skripts verwenden.

Es gibt viele Möglichkeiten, Objekte zu erstellen. Diese Liste ist nicht endgültig:

  • New-Object: Erstellt eine instance eines .NET Framework- oder COM-Objekts.
  • Import-CSV/ ConvertFrom-CSV: Erstellt benutzerdefinierte Objekte (PSCustomObject) aus den Elementen, die als trennzeichentrennte Werte definiert sind.
  • ConvertFrom-Json: Erstellt benutzerdefinierte Objekte, die in der JavaScript-Objektnotation (JSON) definiert sind.
  • ConvertFrom-StringData: Erstellt benutzerdefinierte Objekte, die als Schlüsselwertpaare definiert sind.
  • Add-Type: Ermöglicht das Definieren einer Klasse in Ihrer PowerShell-Sitzung, die Sie mit New-Objectinstanziieren 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 verwenden Add-Member , um ein benutzerdefiniertes Objekt aus einem einfachen Typ zu erstellen, z. B [System.Int32]. .
  • Select-Object: Wählt Eigenschaften für ein Objekt aus. Sie können verwenden Select-Object , um benutzerdefinierte und berechnete Eigenschaften für ein bereits instanziiertes Objekt zu erstellen.

Die folgenden zusätzlichen Methoden werden in diesem Artikel behandelt:

  • Durch Aufrufen des Konstruktors eines Typs mithilfe einer statischen new() Methode
  • Durch Typecasting von Hashtabellen von Eigenschaftsnamen und Eigenschaftswerten

Statische new()-Methode

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)

Nun 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 das erweiterte Typsystem können dem instance zusätzliche Eigenschaften hinzufügen.

Beispielsweise fügt der FileSystem-Anbieter in PowerShell dem von Get-Itemzurückgegebenen DirectoryInfo-Objekt sechs NoteProperty-Werte 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.

Create Objekte aus Hashtabellen

Sie können ein Objekt aus einer Hashtabelle mit Eigenschaften und Eigenschaftenwerten 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 festlegbar sein.

Dieses Feature wurde in PowerShell Version 3.0 hinzugefügt.

Create benutzerdefinierte Objekte aus Hashtabellen

Benutzerdefinierte Objekte sind sehr nützlich und können einfach mit der Hashtabellenmethode erstellt werden. Die PSCustomObject-Klasse ist speziell für diesen Zweck konzipiert.

Benutzerdefinierte Objekte sind eine hervorragende Möglichkeit, eine angepasste Ausgabe von einer Funktion oder einem Skript zurückzugeben. Dies ist nützlicher als das Zurückgeben einer formatierten Ausgabe, die nicht neu formatiert oder an andere Befehle übergeben werden kann.

Die Befehle in der Test-Object function legen einige Variablenwerte fest und verwenden diese Werte dann, 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 benutzerdefinierter Objekte, 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 genau wie bei Standardobjekten verwalten.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

Create nicht benutzerdefinierte Objekte 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 jede 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 anforderung des parameterlosen Konstruktors, beseitigen viele vorhandene Klassen. Die meisten PowerShell-Optionsklassen sind jedoch für die Verwendung 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 die Hashtabellenfunktion verwenden, wenn Sie Parameterwerte festlegen. Beispiel: der Wert des SessionOption-Parameters von 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.

Weitere Informationen