about_Object_Creation

Rövid leírás

Ismerteti, hogyan hozhat létre objektumokat a PowerShellben.

Hosszú leírás

Létrehozhat objektumokat a PowerShellben, és használhatja a parancsokban és szkriptekben létrehozott objektumokat.

Sokféleképpen hozhat létre objektumokat, ez a lista nem végleges:

  • New-Object: Létrehoz egy példányt egy .NET-keretrendszer objektumból vagy COM-objektumból.
  • Import-Csv/ConvertFrom-CSV: Egyéni objektumokat (PSCustomObject) hoz létre a karakterekkel elválasztott értékekként definiált elemekből.
  • ConvertFrom-Json: A JavaScript Object Notation (JSON) alkalmazásban definiált egyéni objektumokat hoz létre.
  • ConvertFrom-StringData: Kulcsértékpárként definiált egyéni objektumokat hoz létre.
  • Add-Type: Lehetővé teszi, hogy meghatározzon egy osztályt a PowerShell-munkamenetben, amellyel New-Objectpéldányosíthat.
  • New-Module: Az AsCustomObject paraméter egy szkriptblokk használatával definiált egyéni objektumot hoz létre.
  • Tag hozzáadása: Tulajdonságok hozzáadása meglévő objektumokhoz. Add-Member Egyéni objektumot egyszerű típusból is létrehozhat, például[System.Int32].
  • Objektum kijelölése: Tulajdonságok kijelölése egy objektumon. Select-Object Egyéni és számított tulajdonságokat hozhat létre egy már példányosított objektumon.

A cikk a következő további módszereket ismerteti:

  • Típus konstruktorának meghívása statikus new() módszerrel
  • Tulajdonságnevek és tulajdonságértékek kivonattábláinak beírásával

Statikus new() metódus

Minden .NET-típus rendelkezik egy new() olyan módszerrel, amellyel egyszerűbben hozhat létre példányokat. Egy adott típus összes elérhető konstruktorát is láthatja.

Egy típus konstruktorainak megtekintéséhez adja meg a new metódus nevét a típusnév után, és nyomja le a billentyűt <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)

Most létrehozhat egy System.Uri-t a megfelelő konstruktor megadásával.

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

Az alábbi mintával megállapíthatja, hogy a példányosításhoz jelenleg mely .NET-típusok vannak betöltve.

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

Előfordulhat, hogy a new() metódussal létrehozott objektumok tulajdonságai nem azonosak a PowerShell-parancsmagok által létrehozott azonos típusú objektumokkal. A PowerShell-parancsmagok, a szolgáltatók és a kiterjesztett típusrendszer további tulajdonságokat adhat a példányhoz.

A PowerShell fájlrendszerszolgáltatója például hat NoteProperty-értéket ad hozzá a függvény által visszaadott Get-ItemDirectoryInfo objektumhoz.

$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

Amikor közvetlenül létrehoz egy DirectoryInfo objektumot, az nem rendelkezik azzal a hat NoteProperty értékkel.

$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

További információ a kiterjesztett típusrendszerről: about_Types.ps1xml.

Ez a funkció a PowerShell 5.0-ban lett hozzáadva

Objektumok létrehozása kivonattáblákból

Tulajdonságokat és tulajdonságértékeket tartalmazó kivonattáblából hozhat létre objektumot.

A szintaxis a következő:

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

Ez a módszer csak paraméter nélküli konstruktorokkal rendelkező osztályok esetében működik. Az objektum tulajdonságainak nyilvánosnak és beállíthatónak kell lenniük.

Ez a funkció a PowerShell 3.0-s verziójában lett hozzáadva

Egyéni objektumok létrehozása kivonattáblákból

Az egyéni objektumok nagyon hasznosak, és könnyen létrehozhatók a kivonattáblázat metódusával. A PSCustomObject osztály kifejezetten erre a célra lett kialakítva.

Az egyéni objektumok kiválóan alkalmasak arra, hogy testre szabott kimenetet adjanak vissza egy függvényből vagy szkriptből. Ez hasznosabb, mint a formázott kimenet visszaadása, amelyet nem lehet más parancsokba újraformálni vagy más parancsokba csövezni.

A beállításban szereplő Test-Object function parancsok változóértékeket tartalmaznak, majd ezeket az értékeket használva létrehoznak egy egyéni objektumot. Ezt az objektumot a parancsmag súgótémakörének Update-Help példaszakaszában tekintheti meg.

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

A függvény kimenete alapértelmezés szerint táblázatként formázott egyéni objektumok gyűjteménye.

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

A felhasználók ugyanúgy kezelhetik az egyéni objektumok tulajdonságait, mint a standard objektumokkal.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

A PSObject típusú objektumok abban a sorrendben őrzik meg a tagok listáját, hogy a tagok hozzá lettek adva az objektumhoz. Annak ellenére , hogy a kivonatoló objektumok nem garantálják a kulcs-érték párok sorrendjét, egy literális kivonatolót ad meg a sorrend fenntartásához [pscustomobject] .

A kivonatolónak literálnak kell lennie. Ha zárójelbe burkolja a kivonatolót, vagy ha egy kivonatolót tartalmazó változót ad meg, nincs garancia arra, hogy a sorrend megmarad.

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

Nem egyéni objektumok létrehozása kivonattáblákból

Kivonattáblákkal objektumokat is létrehozhat nem egyéni osztályokhoz. Ha nem egyéni osztályhoz hoz létre objektumot, a névtér által minősített típusnévre van szükség, bár kihagyhatja a rendszernévtér kezdeti összetevőjét.

A következő parancs például létrehoz egy munkamenet-beállításobjektumot.

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

A kivonattábla-funkció követelményei, különösen a paraméter nélküli konstruktorkövetelmény számos meglévő osztályt kiküszöbölnek. A Legtöbb PowerShell-beállításosztály azonban úgy van kialakítva, hogy ezzel a funkcióval működjön, valamint más nagyon hasznos osztályokat is, például a ProcessStartInfo osztályt.

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

A kivonattábla funkciót a paraméterértékek beállításakor is használhatja. Például a SessionOption paraméter értéke a New-PSSession. a parancsmag lehet kivonattábla.

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

Általános objektumok

A PowerShellben általános objektumokat is létrehozhat. Az általánosak olyan osztályok, struktúrák, interfészek és metódusok, amelyek helyőrzőkkel (típusparaméterekkel) rendelkeznek az általuk tárolt vagy használt típusok egy vagy több típusához.

Az alábbi példa létrehoz egy szótárobjektumot .

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

Az általános szolgáltatásokkal kapcsolatos további információkért lásd: Generics in .NET.

Lásd még