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-String: Postaveno na FlashExtract,
ConvertFrom-String
vytváří vlastní objekty ze strukturovaných řetězcových dat. Toto téma předvede a probere každou z těchto metod. - 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
PSVersion Name System
--------- ---- ------
4.0 Server30 Server Core
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.