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-Objectder 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 Standard die Liste der Member in der Reihenfolge enthalten, in der die Member dem Objekt hinzugefügt wurden. Obwohl Hashtable-Objekte die Reihenfolge der Schlüsselwertpaare nicht garantieren, wird eine Literalhashtable in [pscustomobject] Standard die Reihenfolge beibehalten.

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.

Weitere Informationen