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 JavaScript Object Notation (JSON).
  • ConvertFrom-StringData: Vytvoří vlastní objekty definované jako páry klíč hodnota.
  • Add-Type: Umožňuje definovat třídu v relaci PowerShellu, pomocí které můžete vytvořit instanci New-Object.
  • New-Module: Parametr AsCustomObject vytvoří vlastní objekt, který definujete pomocí bloku skriptu.
  • Add-Member: Přidá vlastnosti do existujících objektů. Můžete použít Add-Member k vytvoření vlastního objektu z jednoduchého typu, například [System.Int32].
  • Select-Object: Vybere vlastnosti objektu. Můžete použít Select-Object k vytvoření vlastních a počítaných vlastností u již vytvořeného objektu.

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

  • Voláním konstruktoru typu pomocí statické new() metody
  • 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 new název metody 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)

Nyní 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í new() metody 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 hodnot NoteProperty do objektu DirectoryInfo vráceného 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 sadě některé hodnoty proměnných a pak tyto hodnoty použijte k vytvoření vlastního objektu. Tento objekt se používá v ukázkové části tématu nápovědy rutiny 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 typu PSObject udržují seznam členů v pořadí, v jakém byly členy přidány do objektu. I když objekty Hashtable nezaručují pořadí párů klíč-hodnota, přetypování literálové hashtable pro [pscustomobject] zachování 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. Když vytvoříte objekt 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í součásti oboru názvů systému .

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 tříd možností PowerShellu je však navržena pro práci s touto funkcí, stejně jako 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 Parametr SessionOption parametru New-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 .NET.

Viz také