about_Object_Creation

Kort beskrivning

Förklarar hur du skapar objekt i PowerShell.

Lång beskrivning

Du kan skapa objekt i PowerShell och använda de objekt som du skapar i kommandon och skript.

Det finns många sätt att skapa objekt. Den här listan är inte slutgiltig:

  • Nytt objekt: Skapar en instans av ett .NET Framework-objekt eller COM-objekt.
  • Import-Csv/ConvertFrom-CSV: Skapar anpassade objekt (PSCustomObject) från de objekt som definieras som teckenavgränsade värden.
  • ConvertFrom-Json: Skapar anpassade objekt som definierats i JavaScript Object Notation (JSON).
  • ConvertFrom-StringData: Skapar anpassade objekt som definieras som nyckelvärdepar.
  • Tilläggstyp: Gör att du kan definiera en klass i powershell-sessionen som du kan instansiera med New-Object.
  • Ny modul: Parametern AsCustomObject skapar ett anpassat objekt som du definierar med hjälp av skriptblock.
  • Tilläggsmedlem: Lägger till egenskaper i befintliga objekt. Du kan använda Add-Member för att skapa ett anpassat objekt av en enkel typ, till exempel [System.Int32].
  • Select-Object: Väljer egenskaper för ett objekt. Du kan använda Select-Object för att skapa anpassade och beräknade egenskaper för ett redan instansierat objekt.

Följande ytterligare metoder beskrivs i den här artikeln:

  • Genom att anropa en typs konstruktor med hjälp av en statisk new() metod
  • Genom att typcasta hash-tabeller med egenskapsnamn och egenskapsvärden

Statisk new()-metod

Alla .NET-typer har en new() metod som gör att du enklare kan skapa instanser. Du kan också se alla tillgängliga konstruktorer för en viss typ.

Om du vill se konstruktorerna för en typ anger du new metodnamnet efter typnamnet och trycker på <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)

Nu kan du skapa en System.Uri genom att ange lämplig konstruktor.

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

Du kan använda följande exempel för att avgöra vilka .NET-typer som för närvarande läses in så att du kan instansiera.

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

Objekt som skapas med new() metoden kanske inte har samma egenskaper som objekt av samma typ som skapas av PowerShell-cmdletar. PowerShell-cmdletar, providers och extended type system kan lägga till extra egenskaper i instansen.

Till exempel lägger FileSystem-providern i PowerShell till sex NoteProperty-värden i DirectoryInfo-objektet som returneras av 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

När du skapar ett DirectoryInfo-objekt direkt har det inte dessa sex NoteProperty-värden .

$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

Mer information om systemet för utökad typ finns i about_Types.ps1xml.

Den här funktionen har lagts till i PowerShell 5.0

Skapa objekt från hash-tabeller

Du kan skapa ett objekt från en hash-tabell med egenskaper och egenskapsvärden.

Syntaxen ser ut så här:

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

Den här metoden fungerar endast för klasser som har en parameterlös konstruktor. Objektegenskaperna måste vara offentliga och kan ställas in.

Den här funktionen har lagts till i PowerShell version 3.0

Skapa anpassade objekt från hash-tabeller

Anpassade objekt är mycket användbara och är enkla att skapa med hjälp av hashtabellmetoden. KLASSEN PSCustomObject är särskilt utformad för detta ändamål.

Anpassade objekt är ett utmärkt sätt att returnera anpassade utdata från en funktion eller ett skript. Detta är mer användbart än att returnera formaterade utdata som inte kan formateras om eller skickas till andra kommandon.

Kommandona i uppsättningen Test-Object function vissa variabelvärden och använd sedan dessa värden för att skapa ett anpassat objekt. Du kan se det här objektet som används i exempelavsnittet i cmdlet-hjälpavsnittet 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

Utdata från den här funktionen är en samling anpassade objekt som formateras som en tabell som standard.

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

Användare kan hantera egenskaperna för de anpassade objekten precis som med standardobjekt.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

PSObject-typobjekt underhåller listan över medlemmar i den ordning som medlemmarna har lagts till i objektet. Även om Hashtable-objekt inte garanterar ordningen på nyckel/värde-paren, genererar du en literal hashtable för att [pscustomobject] behålla ordningen.

Hashtabellen måste vara en literal. Om du omsluter hashtabellen inom parenteser eller om du kastar en variabel som innehåller en hashtable, finns det ingen garanti för att ordningen bevaras.

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

Skapa icke-anpassade objekt från hash-tabeller

Du kan också använda hash-tabeller för att skapa objekt för icke-anpassade klasser. När du skapar ett objekt för en icke-anpassad klass krävs det namnområdeskvalificerade typnamnet, även om du kan utelämna någon inledande systemnamnområdeskomponent .

Följande kommando skapar till exempel ett sessionsalternativobjekt.

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

Kraven för hashtabellfunktionen, särskilt kravet på parameterlös konstruktor, eliminerar många befintliga klasser. De flesta PowerShell-alternativklasser är dock utformade för att fungera med den här funktionen, liksom andra mycket användbara klasser, till exempel klassen 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
...

Du kan också använda funktionen hashtabell när du anger parametervärden. Till exempel värdet för parametern SessionOption för New-PSSession. cmdlet kan vara en hash-tabell.

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

Generiska objekt

Du kan också skapa generiska objekt i PowerShell. Generiska objekt är klasser, strukturer, gränssnitt och metoder som har platshållare (typparametrar) för en eller flera av de typer som de lagrar eller använder.

I följande exempel skapas ett ordlisteobjekt .

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

Mer information om generiska objekt finns i Generiska objekt i .NET.

Se även