Delen via


about_Object_Creation

Korte beschrijving

Hierin wordt uitgelegd hoe u objecten maakt in PowerShell.

Lange beschrijving

U kunt objecten maken in PowerShell en de objecten gebruiken die u in opdrachten en scripts maakt.

Er zijn veel manieren om objecten te maken. Deze lijst is niet definitief:

  • New-Object: hiermee maakt u een exemplaar van een .NET Framework-object of COM-object.
  • Import-CSV/ConvertFrom-CSV: hiermee maakt u aangepaste objecten (PSCustomObject) van de items die zijn gedefinieerd als door tekens gescheiden waarden.
  • ConvertFrom-Json: hiermee maakt u aangepaste objecten die zijn gedefinieerd in JavaScript Object Notation (JSON).
  • ConvertFrom-StringData: hiermee maakt u aangepaste objecten die zijn gedefinieerd als sleutelwaardeparen.
  • Add-Type: Hiermee kunt u een klasse definiëren in uw PowerShell-sessie die u kunt instantiëren met New-Object.
  • New-Module: Met de parameter AsCustomObject maakt u een aangepast object dat u definieert met behulp van een scriptblok.
  • Add-Member: Hiermee voegt u eigenschappen toe aan bestaande objecten. U kunt gebruiken Add-Member om een aangepast object te maken van een eenvoudig type, zoals [System.Int32].
  • Select-Object: hiermee selecteert u eigenschappen voor een object. U kunt gebruiken Select-Object om aangepaste en berekende eigenschappen te maken voor een al geïnstantieerd object.

In dit artikel worden de volgende aanvullende methoden behandeld:

  • Door de constructor van een type aan te roepen met behulp van een statische new() methode
  • Door hashtabellen van eigenschapsnamen en eigenschapswaarden te typecasten

Methode Static new()

Alle .NET-typen hebben een new() methode waarmee u eenvoudiger exemplaren kunt maken. U kunt ook alle beschikbare constructors voor een bepaald type zien.

Als u de constructors voor een type wilt zien, geeft u de new methodenaam op na de typenaam en drukt u op <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)

U kunt nu een System.URI maken door de juiste constructor op te geven.

[System.Uri]::new("https://www.bing.com")
AbsolutePath   : /
AbsoluteUri    : https://www.bing.com/
LocalPath      : /
Authority      : www.bing.com
...

U kunt het volgende voorbeeld gebruiken om te bepalen welke .NET-typen momenteel worden geladen om te instantiëren.

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

Objecten die met de new() methode zijn gemaakt, hebben mogelijk niet dezelfde eigenschappen als objecten van hetzelfde type die zijn gemaakt met PowerShell-cmdlets. PowerShell-cmdlets, providers en Extended Type System kunnen extra eigenschappen toevoegen aan het exemplaar.

De bestandssysteemprovider in PowerShell voegt bijvoorbeeld zes NoteProperty-waarden toe aan het object DirectoryInfo dat wordt geretourneerd door 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

Wanneer u rechtstreeks een DirectoryInfo-object maakt, bevat het niet deze zes NoteProperty-waarden .

$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

Zie about_Types.ps1xml voor meer informatie over het Extended Type System.

Deze functie is toegevoegd in PowerShell 5.0

objecten uit hash-tabellen Creatie

U kunt een object maken op basis van een hashtabel met eigenschappen en eigenschapswaarden.

De syntaxis is als volgt:

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

Deze methode werkt alleen voor klassen die een constructor zonder parameter hebben. De objecteigenschappen moeten openbaar en instelbaar zijn.

Deze functie is toegevoegd in PowerShell versie 3.0

aangepaste objecten uit hash-tabellen Creatie

Aangepaste objecten zijn erg handig en zijn eenvoudig te maken met behulp van de hash-tabelmethode. De klasse PSCustomObject is speciaal voor dit doel ontworpen.

Aangepaste objecten zijn een uitstekende manier om aangepaste uitvoer van een functie of script te retourneren. Dit is nuttiger dan het retourneren van opgemaakte uitvoer die niet opnieuw kan worden opgemaakt of doorgesluisd naar andere opdrachten.

Met de opdrachten in de Test-Object function worden enkele variabelewaarden ingesteld en vervolgens gebruikt u deze waarden om een aangepast object te maken. U kunt zien dat dit object wordt gebruikt in de voorbeeldsectie van het Help-onderwerp van de Update-Help cmdlet.

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

De uitvoer van deze functie is een verzameling aangepaste objecten die standaard zijn opgemaakt als een tabel.

ModuleName        UICulture      Version
---------         ---------      -------
PSScheduledJob    en-us          3.1.0.0
PSWorkflow        en-us          3.0.0.0

Gebruikers kunnen de eigenschappen van de aangepaste objecten net zo beheren als bij standaardobjecten.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

PsObject-typeobjecten onderhouden de lijst met leden in de volgorde waarin de leden zijn toegevoegd aan het object. Hoewel Hashtable-objecten de volgorde van de sleutel-waardeparen niet garanderen, blijft het casten van een letterlijke hashtabel om de volgorde te [pscustomobject] behouden.

De hashtabel moet een letterlijke tabel zijn. Als u de hashtabel tussen haakjes plaatst of als u een variabele met een hashtabel cast, is er geen garantie dat de volgorde wordt behouden.

$hash = @{
    Name      = "Server30"
    System    = "Server Core"
    PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System      Name     PSVersion
------      ----     ---------
Server Core Server30 4.0

niet-aangepaste objecten uit hash-tabellen Creatie

U kunt ook hashtabellen gebruiken om objecten te maken voor niet-aangepaste klassen. Wanneer u een object voor een niet-aangepaste klasse maakt, is de naamruimte-gekwalificeerde typenaam vereist, hoewel u elk initieel onderdeel van de systeemnaamruimte kunt weglaten.

Met de volgende opdracht wordt bijvoorbeeld een sessieoptieobject gemaakt.

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

De vereisten van de hashtabelfunctie, met name de parameterloze constructorvereiste, elimineren veel bestaande klassen. De meeste PowerShell-optieklassen zijn echter ontworpen om te werken met deze functie, evenals andere zeer nuttige klassen, zoals de klasse ProcessStartInfo .

[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
...

U kunt ook de hashtabelfunctie gebruiken bij het instellen van parameterwaarden. Bijvoorbeeld de waarde van de SessionOption-parameter van de New-PSSession. cmdlet kan een hash-tabel zijn.

New-PSSession -ComputerName Server01 -SessionOption @{
  IdleTimeout=43200000
  SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
  Frequency="Daily"
  At="15:00"
}

Algemene objecten

U kunt ook algemene objecten maken in PowerShell. Generics zijn klassen, structuren, interfaces en methoden met tijdelijke aanduidingen (typeparameters) voor een of meer van de typen die ze opslaan of gebruiken.

In het volgende voorbeeld wordt een dictionary-object gemaakt.

$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One     1

Zie Generics in .NET voor meer informatie over generics.

Zie ook