Sdílet prostřednictvím


about_Object_Creation

Krátký popis

Vysvětluje, jak vytvářet objekty v PowerShellu.

Dlouhý popis

V PowerShellu můžete vytvářet objekty a používat objekty, které vytvoříte v příkazech a skriptech.

Existuje mnoho způsobů, jak vytvořit objekty, tento seznam není konečný:

  • new-object: Vytvoří instanci objektu rozhraní .NET Framework nebo objektu COM.
  • Import-Csv/ConvertFrom-Csv: Vytvoří vlastní objekty (PSCustomObject) z položek definovaných jako hodnoty oddělené znakem.
  • convertFrom-Json: Vytvoří vlastní objekty definované v javascriptové notaci objektu (JSON).
  • ConvertFrom-StringData: Vytvoří vlastní objekty definované jako páry klíč-hodnota.
  • doplňku: Umožňuje definovat třídu v relaci PowerShellu, kterou můžete vytvořit instanci pomocí New-Object.
  • New-Module: Parametr AsCustomObject vytvoří vlastní objekt, který definujete pomocí scriptblock.
  • doplňku: Přidá vlastnosti do existujících objektů. Pomocí Add-Member můžete vytvořit vlastní objekt z jednoduchého typu, například [System.Int32].
  • Select-Object: Vybere vlastnosti objektu. Pomocí Select-Object můžete vytvořit vlastní a počítané vlastnosti u již vytvořeného objektu.

V tomto článku jsou popsané následující další metody:

  • Voláním konstruktoru typu pomocí statické metody new()
  • Zadáním hash tabulek názvů vlastností a hodnot vlastností

Static new() – metoda

Všechny typy .NET mají metodu new(), která umožňuje snadněji vytvářet instance. Můžete také zobrazit všechny dostupné konstruktory pro daný typ.

Chcete-li zobrazit konstruktory pro typ, zadejte název metody new za název typu a stiskněte <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)

Teď můžete vytvořit System.Uri zadáním příslušného konstruktoru.

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

Pomocí následující ukázky můžete určit, jaké typy .NET jsou aktuálně načteny, abyste mohli vytvořit instanci.

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

Objekty vytvořené pomocí metody new() nemusí mít stejné vlastnosti jako objekty stejného typu, které jsou vytvořeny rutinami PowerShellu. Rutiny, poskytovatelé a rozšířený systém typů PowerShellu můžou do instance přidat další vlastnosti.

Například zprostředkovatel FileSystem v PowerShellu přidá šest NoteProperty hodnoty do objektu DirectoryInfo vrácený 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

Když vytvoříte objekt DirectoryInfo přímo, nemá tyto šest hodnot NoteProperty.

$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

Další informace o rozšířeném systému typů naleznete v tématu about_Types.ps1xml.

Tato funkce byla přidána v PowerShellu 5.0.

Vytváření objektů z tabulek hash

Objekt můžete vytvořit z tabulky hash vlastností a hodnot vlastností.

Syntaxe je následující:

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

Tato metoda funguje pouze pro třídy, které mají konstruktor bez parametrů. Vlastnosti objektu musí být veřejné a nastavené.

Tato funkce byla přidána v PowerShellu verze 3.0.

Vytváření vlastních objektů z tabulek hash

Vlastní objekty jsou velmi užitečné a snadno se vytvářejí pomocí metody hash tabulky. PSCustomObject třída je navržena speciálně pro tento účel.

Vlastní objekty představují skvělý způsob, jak vrátit přizpůsobený výstup z funkce nebo skriptu. To je užitečnější než vrácení formátovaného výstupu, který nelze přeformátovat ani přeformátovat do jiných příkazů.

Příkazy v Test-Object function nastavují některé hodnoty proměnných a pak tyto hodnoty používají k vytvoření vlastního objektu. Tento objekt se používá v ukázkové části tématu nápovědy k rutině 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

Výstupem této funkce je kolekce vlastních objektů formátovaných jako tabulka ve výchozím nastavení.

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

Uživatelé mohou spravovat vlastnosti vlastních objektů stejně jako u standardních objektů.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

objekty PSObject typu udržují seznam členů v pořadí, v jakém byly členy přidány do objektu. I když Hashtable objekty nezaručují pořadí párů klíč-hodnota, přetypování literálové hashtable na [pscustomobject] udržuje pořadí.

Hashtable musí být literál. Pokud zabalíte hashovací tabulku do závorek nebo pokud přetypujete proměnnou obsahující hashtable, neexistuje žádná záruka, že pořadí zůstane zachováno.

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

Vytváření jiných než vlastních objektů z tabulek hash

K vytváření objektů pro jiné než vlastní třídy můžete použít také tabulky hash. Při vytváření objektu pro třídu, která není vlastní, je požadován název kvalifikovaného typu oboru názvů, i když můžete vynechat všechny počáteční system součást oboru názvů.

Například následující příkaz vytvoří objekt možnosti relace.

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

Požadavky funkce hash tabulky, zejména požadavek konstruktoru bez parametrů, eliminují mnoho existujících tříd. Většina možností PowerShellu třídy jsou však navrženy tak, aby fungovaly s touto funkcí, a také další velmi užitečné třídy, jako je ProcessStartInfo třída.

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

Při nastavování hodnot parametrů můžete také použít funkci hashovací tabulky. Například hodnota parametru SessionOptionNew-PSSession. Rutina může být hashovací tabulka.

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

Obecné objekty

V PowerShellu můžete také vytvořit obecné objekty. Obecné typy jsou třídy, struktury, rozhraní a metody, které mají zástupné symboly (parametry typu) pro jeden nebo více typů, které ukládají nebo používají.

Následující příklad vytvoří objekt Dictionary.

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

Další informace o obecných formátech najdete v tématu Obecné typy v rozhraní .NET.

Viz také