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 maakt in opdrachten en scripts.

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 sleutel-waardeparen.
  • Add-Type: Hiermee kunt u een klasse definiëren in uw PowerShell-sessie waarmee u een instantie kunt maken New-Object.
  • New-Module: De parameter AsCustomObject maakt een aangepast object dat u definieert met behulp van scriptblok.
  • Add-Member: Voegt eigenschappen toe aan bestaande objecten. U kunt Add-Member een aangepast object maken op basis van een eenvoudig type, zoals [System.Int32].
  • Select-Object: Selecteert eigenschappen voor een object. U kunt Select-Object aangepaste en berekende eigenschappen maken op 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 naam van de new methode 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 zijn gemaakt met behulp van de new() methode, hebben mogelijk niet dezelfde eigenschappen als objecten van hetzelfde type dat door PowerShell-cmdlets worden gemaakt. PowerShell-cmdlets, providers en uitgebreid typesysteem kunnen extra eigenschappen toevoegen aan het exemplaar.

De FileSystem-provider in PowerShell voegt bijvoorbeeld zes NoteProperty-waarden toe aan het DirectoryInfo-object 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, beschikt het niet over 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 uitgebreide typesysteem.

Deze functie is toegevoegd in PowerShell 5.0

Objecten maken op afstand van hashtabellen

U kunt een object maken op basis van een hash-tabel 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 met een parameterloze constructor. De objecteigenschappen moeten openbaar en ingesteld zijn.

Deze functie is toegevoegd in PowerShell versie 3.0

Aangepaste objecten maken van hashtabellen

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

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

De opdrachten in de Test-Object function set enkele variabelewaarden en gebruiken deze waarden vervolgens om een aangepast object te maken. U kunt dit object in gebruik zien in de voorbeeldsectie van het Help-onderwerp voor cmdlets Update-Help .

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 standaard een verzameling aangepaste objecten die 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 als bij standaardobjecten beheren.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

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

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

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

Niet-aangepaste objecten maken vanuit hash-tabellen

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 een eerste onderdeel van de systeemnaamruimte weglaat.

Met de volgende opdracht maakt u bijvoorbeeld een sessieoptieobject.

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

De vereisten van de hash-tabelfunctie, met name de constructorvereiste zonder parameters, elimineren veel bestaande klassen. De meeste PowerShell-optieklassen zijn echter ontworpen om met deze functie te werken, 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 parameter SessionOption 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 woordenlijstobject 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