Windows PowerShell je prostředí příkazového prostředí, které podporuje objektově orientované skriptování založené na Microsoft .NET Framework. Jeho jádrem je rutina prostředí PowerShell, lehký příkaz, který provede určitou akci a přitom vrátí objekt .NET. Prostředí PowerShell umožňuje pomocí rutin přistupovat k různým systémům a provádět proti nim řadu úloh. Samotné rutiny však k provedení určitých akcí vždy nestačí. Pro tyto akce je často nutné vytvořit vlastní objekty založené na třídách .NET. Jedním z typů objektů .NET, které můžete vytvořit, je vlastní objekt. Vlastní objekt umožňuje definovat typy dat přiřazených tomuto objektu a akce, které může provádět. Až pochopíte, jak vytvořit vlastní objekt, získáte mocný nástroj pro vytváření skriptů, které mohou rozšířit již tak značný dosah prostředí PowerShell.
Poznamenejte, že rámec .NET a objektově orientované programování jsou složitá témata, která dalece přesahují rozsah tohoto článku. Chcete-li plně ocenit objektovou povahu prostředí PowerShell, může vám pomoci alespoň základní znalost těchto konceptů. Další informace o frameworku .NET Framework naleznete v článku MSDN „Overview of the .NET Framework“. Úvod do objektově orientovaného programování najdete v článku MSDN „Objektově orientované programování (C# a Visual Basic)“.
Vytvoření vlastního objektu
Chcete-li v prostředí PowerShell vytvořit vlastní objekt, musíte nejprve pomocí rutiny New-Object vytvořit počáteční objekt. Tato rutina umožňuje vytvářet objekty .NET nebo COM ze sortimentu tříd. Vlastní objekt je speciální typ objektu .NET založený na třídě Object nebo PSObject .NET. Při vytváření počátečního objektu mezi nimi není žádný rozdíl. Obecně se však dává přednost třídě PSObject kvůli problémům, které mohou nastat při přidávání vlastností do objektu založeného na třídě Object, takže použijme PSObject.
Chcete-li vytvořit objekt založený na třídě PSObject, musíte použít rutinu New-Object s parametrem -TypeName a jako hodnotu parametru zadat třídu PSObject, například takto:
$system = New-Object -TypeName PSObject
Při spuštění tohoto příkazu se vygeneruje objekt PSCustomObject a přiřadí se do proměnné $system. Nejčastěji budete chtít objekt přiřadit do proměnné, abyste mohli snadno pracovat se členy tohoto objektu. Členy jsou součásti, které tvoří objekt, například vlastnosti, metody, aliasy vlastností a sady členů.
Při práci s objekty v prostředí PowerShell budete pravděpodobně používat dva typy členů: vlastnosti a metody. Vlastnost popisuje určitý aspekt objektu. Například jedním z členů třídy FileInfo .NET je vlastnost Length, která udává velikost souboru v bajtech. Pokud vytvoříte objekt FileInfo založený na této třídě, můžete použít vlastnost Length pro přístup k velikosti souboru přidruženého k tomuto objektu. Metoda provádí akci související s objektem. Například třída FileInfo obsahuje také metodu Delete, kterou můžete použít ke smazání souboru reprezentovaného tímto objektem.
Snadná identifikace členů objektu usnadňuje práci s tímto objektem. Chcete-li získat seznam členů, které tvoří objekt, můžete použít rutinu Get-Member. Chcete-li se například podívat na členy nového objektu, který byl přiřazen proměnné $system, můžete proměnnou $system předat rutině Get-Member:
$system | Get-Member
Jak ukazuje obrázek 1, vytvořený objekt je založen na třídě System.Management.Automation.PSCustomObject, která obsahuje pouze malý počet členů, z nichž všechny jsou metody. Ale právě proto se mu říká vlastní objekt – můžete si ho přizpůsobit přidáním vlastních členů.
Než vám ukážu, jak přidat členy, dodám jen, že stejně jako mnoho jiných tříd .NET obsahuje třída PSCustomObject také řadu skrytých členů různých typů, například memberset a codeproperty. Tyto členy můžete zobrazit tak, že při volání rutiny Get-Member uvedete parametr -Force. Ačkoli diskuse o skrytých členech přesahuje rámec tohoto článku, mohlo by se vám někdy hodit prozkoumat skryté členy, které jsou k dispozici třídě PSCustomObject a dalším třídám .NET, abyste mohli plně využívat objekty prostředí PowerShell.
Přidání vlastností k vlastnímu objektu
Vlastní objekt je jen tak užitečný, jak užitečné jsou členy, které jsou s ním spojeny. K vlastnímu objektu můžete přidat několik různých typů členů. V tomto příkladu budete přidávat členy NoteProperty a ScriptMethod. Člen NoteProperty je podobný běžné vlastnosti a člen ScriptMethod je podobný běžné metodě. Do vlastního objektu nemůžete přidat běžnou vlastnost nebo metodu, proto budete používat členy NoteProperty a ScriptMethod. (Informace o podporovaných členech ve vlastním objektu najdete v tématu PowerShell TechNet „Add-Member.“)
Začneme přidáním několika členů NoteProperty do objektu $system. Pro přidání členů můžete použít rutinu Add-Member, která definuje názvy a hodnoty vlastností. Předpokládejme například, že chcete přidat vlastnosti poznámek na základě dat získaných prostřednictvím funkcí Windows Management Instrumentation (WMI) zabudovaných do prostředí PowerShell. (WMI poskytuje infrastrukturu pro správu dat a operací v operačních systémech Windows.) Objektový model WMI obsahuje řadu tříd, které podporují širokou škálu operací správy. Například třída Win32_OperatingSystem poskytuje přístup k takovým informacím, jako je název operačního systému nainstalovaného v počítači a nejnovější servisní balíček aplikovaný na tento operační systém.
Chcete-li vytvořit objekt WMI, použijte rutinu Get-WmiObject a zadejte požadovanou třídu. Chcete-li například vytvořit objekt WMI Win32_OperatingSystem a přiřadit jej proměnné $os, použijete kód:
$os = Get-WmiObject Win32_OperatingSystem
V tomto případě získáváte systémové informace z místního počítače, ale krása rozhraní WMI spočívá v jeho schopnosti přistupovat a spravovat také vzdálené počítače se systémem Windows.
Proměnnou $os pak můžete použít k přístupu k informacím vráceným tímto objektem. Přiřazení objektu do proměnné tímto způsobem uzamkne data v daném okamžiku. Pokud je například po vytvoření proměnné $os na operační systém aplikován nový servisní balíček, vlastnost CSDVersion objektu nebude tuto změnu reflektovat, protože objekt byl vytvořen na základě původních dat.
Po definování proměnné $os je třeba zadat dva příkazy Add-Member. Každý příkaz bude mít čtyři parametry:
- -InputObject. Pomocí parametru -InputObject určíte objekt, který obdrží nové vlastnosti poznámky. V tomto případě musíte zadat objekt $system.
- -MemberType. Parametr -MemberType označuje typ členu, který se má vytvořit, takže musíte zadat NoteProperty.
- -Name. Pomocí parametru -Name určíte název nového členu. Pro tento příklad pojmenujeme první člen OperatingSystem a druhý člen ServicePack.
- -Value. Tento parametr určuje hodnotu členu. U prvního členu je třeba zadat vlastnost $os.Caption, aby se vrátil název operačního systému. Pro druhou vlastnost poznámky je třeba zadat $os.CSDVersion, aby se vrátil nejnovější servisní balíček aplikovaný na OS.
Takto vypadají oba příkazy Add-Member:
Add-Member -InputObject $system -MemberType NoteProperty ` -Name OperatingSystem -Value $os.CaptionAdd-Member -InputObject $system -MemberType NoteProperty ` -Name ServicePack -Value $os.CSDVersion
Všimněte si, že jsem každý příkaz Add-Member rozdělil do dvou řádků. Na konec každého prvního řádku jsem vložil zpětné zaškrtnutí (`), aby procesor prostředí PowerShell věděl, že má pokračovat na další řádek pro dokončení příkazu.
Po spuštění příkazů Add-Member můžete zavolat proměnnou $system a zobrazit její obsah:
$system
Obrázek 2 ukazuje ukázkové výsledky.
Proměnnou $system můžete také použít k volání jednotlivých členů. Stačí zadat název proměnné, za kterým následuje tečka a poté název členu. Například následující příkaz vrátí aktuální hodnotu vlastnosti OperatingSystem note:
$system.OperatingSystem
Jednou z výhod vytvoření vlastního objektu je, že umožňuje vytvořit vlastnosti note na základě dat, která pocházejí z různých zdrojů, a také vlastnost note, jejíž hodnotou je konkrétní řetězec. Podívejte se například na kód v Listingu 1, který přidává tři nové vlastnosti poznámky do objektu $system.
$mem = Get-WmiObject Win32_PhysicalMemory$disk = Get-WmiObject Win32_DiskDriveAdd-Member -InputObject $system -MemberType NoteProperty ` -Name PhysicalMemory ` -Value (("{0:N2}" -f ($mem.Capacity/1GB)) + ' GB')Add-Member -InputObject $system -MemberType NoteProperty ` -Name DiskSize ` -Value (("{0:N2}" -f ($disk.Size/1GB)) + ' GB')Add-Member -InputObject $system -MemberType NoteProperty ` -Name Owner -Value "janetp"
Většinu prvků v Listingu 1 jste viděli v předchozím příkladu. Všimněte si však, že kód vytváří instanci třídy Win32_PhysicalMemory, která je přiřazena proměnné $mem, a instanci třídy Win32_DiskDrive, která je přiřazena proměnné $disk. Dvě z přidaných vlastností poznámky používají tyto nové objekty WMI jako zdroje dat.
První příkaz Add-Member načte data z vlastnosti $mem.Capacity, která poskytuje kapacitu paměti v cílovém systému. V tomto případě je však parametr -Value poněkud složitější než v předchozím příkladu. Nejprve je v příkazu uvedeno „{0:N2}“, za kterým následuje -f, což je konstrukce .NET pro formátování vypisovaného čísla. V podstatě určuje, že se má vrátit číslo se dvěma desetinnými místy. Po formátovacích instrukcích následuje krátký výraz ($mem.Capacity/1GB), který dělí hodnotu Capacity 1GB. Hodnota Capacity udává velikost paměti v bajtech. Prostředí PowerShell umožňuje snadný převod bajtů na gigabajty prostým dělením 1GB. Nakonec příkaz na výstupu označí řetězec ‚ GB‘ (včetně mezery) a celý jej uzavře do závorek.
Druhý příkaz Add-Member postupuje podle stejné logiky a vrací velikost pevného disku počítače. Použije vlastnost $disk.Size, aby vrátil velikost v bajtech, a pak ji převede na gigabajty.
Třetí příkaz Add-Member přidá vlastnost poznámky s názvem Owner a přiřadí jí řetězcovou hodnotu janetp. V tomto případě může „vlastník“ znamenat cokoli – primárního uživatele, posledního uživatele, správce nebo jakýkoli význam, který chcete této vlastnosti přiřadit. Zařadil jsem ji sem pouze proto, abych demonstroval, že můžete přidat vlastnost poznámka, jejíž hodnotou je jednoduchý řetězec.
Po přidání tří členů do vlastního objektu můžete opět zavolat proměnnou $system. Ta vrátí výsledky jako na obrázku 3.
Máte nyní jediný objekt, který obsahuje data odvozená ze tří různých objektů WMI. Objekt obsahuje také vlastnost Owner, která je založena na řetězcové hodnotě. Tuto vlastnost Note můžete zavolat stejně jako jakýkoli jiný člen:
$system.Owner
Jak jste očekávali, příkaz vrátí hodnotu janetp. Tuto hodnotu však můžete změnit na jinou tak, že vlastnosti přiřadíte novou hodnotu, například takto:
$system.Owner = "rogert"
V tomto případě byla vlastnosti Owner note přiřazena hodnota rogert. Pokud nyní zavoláte tuto vlastnost note, vrátí novou hodnotu.
Stejně jako u mnoha jiných úloh, které můžete v prostředí PowerShell provádět, existuje řada různých způsobů, jak přidat člen do vlastního objektu. Prostředí PowerShell 3.0 například umožňuje vytvořit hashovací tabulku a předat ji příkazu New-Object. Kód v Seznamu 2 vytváří stejných pět vlastností poznámky, ale k předání názvů a hodnot členů používá hashovací tabulku.
$info = @{ "OperatingSystem" = $os.Caption; "ServicePack" = $os.CSDVersion; "PhysicalMemory" = (("{0:N2}" -f ($mem.Capacity/1GB)) + ' GB'); "DiskSize" = (("{0:N2}" -f ($disk.Size/1GB)) + ' GB'); "Owner" = 'janetp'}$system = New-Object -TypeName PSObject -Property $info$system
Tento kód nejprve vytvoří hashovací tabulku, která definuje pět dvojic vlastnost/hodnota, z nichž každá odpovídá vlastnostem poznámky. Jak ukazuje kód, je třeba oddělovat dvojice vlastnost/hodnota středníky. Dále je třeba uzavřít sadu pěti dvojic vlastnost/hodnota do kudrnatých závorek a před otevírací závorku umístit symbol at (@). Nakonec je třeba přiřadit hashovací tabulku do proměnné $info.
Po definování hashovací tabulky kód pomocí rutiny New-Object vytvoří objekt založený na třídě PSObject a přiřadí jej do proměnné $system. Pouze tentokrát příkaz obsahuje parametr -Property, který jako hodnotu přebírá proměnnou $info.
Nakonec kód zavolá proměnnou $system, která vrátí výsledky jako na obrázku 4. Všimněte si pořadí, v jakém byly vlastnosti do objektu přidány. Jedním z problémů při použití hashovací tabulky pro přidávání vlastností poznámek je, že nemůžete řídit jejich pořadí. Chcete-li pořadí řídit, musíte k přidání jednotlivých členů použít rutinu Add-Member.
Přidání metod k vlastnímu objektu
Když jste viděli, jak snadné je přidávat vlastnosti, přistupovat k jejich hodnotám a tyto hodnoty měnit, přejděme k metodám. Ty jsou o něco složitější, protože metody musí něco dělat a vy musíte toto něco definovat jako součást hodnoty metody.
Například kód v Listingu 3 vytváří metodu, která načte aktuální datum a čas a vrátí je jak v původním formátu, tak jako hodnoty koordinovaného světového času (UTC).
$method ={ $a = Get-Date -Format F; "Local: " + $a; $b = Get-Date; "UTC: " + $b.ToUniversalTime().DateTime}Add-Member -InputObject $system -MemberType ScriptMethod ` -Name GetUTC -Value $method
Aby byl kód čitelný, můžete hodnotu metody přiřadit proměnné (např. $method). Tato hodnota obsahuje výrazy potřebné k vrácení informací o datu a čase. Abyste však mohli hodnotu předat do příkazu Add-Member, musíte ji definovat jako blok skriptu. Za tímto účelem uzavřete obsah hodnoty do kulatých závorek. PowerShell pak přiřadí hodnotu v její aktuální podobě do proměnné jako objekt ScriptBlock.
V výpisu 3 obsahuje hodnota metody dva výrazy. První výraz vrací aktuální datum a čas a druhý výraz vrací verzi UTC. První výraz zahájíte použitím rutiny Get-Date pro získání aktuálního data a času, které přiřadíte proměnné $a. Všimněte si, že při volání rutiny Get-Date je třeba uvést parametr -Format spolu s hodnotou F. Ten prostředí PowerShell říká, aby zobrazilo časové razítko v plném formátu data a času, jako například Monday, August 19, 2013 12:28:25 PM. Poté přidáte řetězec „Local: „
V druhém výrazu opět začnete rutinou Get-Date, abyste vrátili aktuální datum a čas, které přiřadíte proměnné $b. Poté použijete metodu ToUniversalTime této proměnné, abyste vrátili datum a čas jako hodnotu UTC, a pak zadáte vlastnost DateTime, abyste vrátili správný formát.
Pokud byste v tomto okamžiku zavolali proměnnou $method, vrátila by oba výrazy jako řetězce, tak jak byly zadány. Protože jste hodnotu proměnné definovali jako blok skriptu, příkazy se při přiřazení do proměnné $method nezpracovávají. Místo toho je proměnná $method vytvořena jako objekt ScriptBlock, což můžete potvrdit použitím metody GetType, abyste zjistili typ proměnné:
$method.GetType()
Chcete-li pracovat s blokem skriptů, musíte po definování proměnné $method přidat metodu jako člen objektu $system. Za tímto účelem vytvoříte příkaz Add-Member, který jako typ uvede ScriptMethod, jako název GetUTC a jako hodnotu proměnnou $method.
Po spuštění kódu v Listingu 3 můžete pomocí proměnné $system zavolat metodu GetUTC stejným způsobem, jakým jste volali vlastnosti:
$system.GetUTC()
Všimněte si však, že při volání skriptovací metody musíte uvést závorky, stejně jako u jakékoli jiné metody, i když nepředáváte argumenty. Metoda by nyní měla vrátit podobné výsledky jako na obrázku 5, ale s datem a časem, kdy jste metodu zavolali.
V reálném životě budete pravděpodobně chtít vytvořit metody, které mají větší sílu. Například objekt $system by mohl do svých skriptovacích metod zahrnout úlohy správy WMI. Pokud tak učiníte, musíte metodu plně otestovat, abyste se ujistili, že vaše příkazy dělají přesně to, co mají. Prostředí PowerShell i rozhraní WMI jsou mocné nástroje, proto je třeba je při správě počítačů se systémem Windows používat opatrně.
Přidání vlastních objektů do pole
Vlastní objekty nejsou omezeny pouze na samostatné objekty, které jednou použijete a zahodíte. Tyto objekty můžete přidat do pole objektů a pak k nim přistupovat prostřednictvím tohoto pole. Předpokládejme například, že chcete manipulovat s informacemi získanými z více počítačů. Tyto informace mohou zahrnovat podrobnosti o paměti a logických jednotkách dostupných v těchto systémech. S těmito údaji chcete v prostředí PowerShell smysluplně pracovat. Vzhledem k objektové povaze prostředí PowerShell je umístění těchto informací do objektů často nejjednodušším způsobem, jak s těmito daty pracovat.
Podívejme se na příklad, jak byste to mohli udělat. Pro tuto diskusi není důležitý přístup použitý ke shromažďování informací o různých počítačích. Můžete například nastavit smyčku foreach v prostředí PowerShell, která pomocí rozhraní WMI získá informace z různých pracovních stanic. Bez ohledu na použitou metodu předpokládejme pro stručnost, že jste informace shromáždili do textového souboru odděleného čárkou, který obsahuje data zobrazená na obrázku 6.
Textový soubor obsahuje řádek záhlaví a řádek pro logické jednotky každého systému. Například první řádek dat poskytuje podrobnosti o logické jednotce C v počítači ws01. Logická jednotka má kapacitu 500 GB a 225 GB volného místa. Systém má také 4 GB paměti. Druhý řádek uvádí, že stejný počítač obsahuje také logickou jednotku D, která má stejnou kapacitu jako jednotka C, ale s 320 GB volného místa.
Cílem je vytvořit z každého řádku dat vlastní objekt a poté tyto objekty přidat do pole. S objekty v poli pak můžete provádět akce tak, že data předáte dalším příkazům prostředí PowerShell. Kód v Seznamu 4 definuje prázdné pole, importuje data z textového souboru a poté pomocí smyčky foreach vytvoří objekty a přidá je do pole.
$SystemInfo = @()$SourceData = Import-CSV C:\DataFiles\SourceData.txtforeach ($source in $SourceData){ $system = New-Object -TypeName PSObject $system | Add-Member -Type NoteProperty ` -Name Computer -Value $source.Computer $system | Add-Member -Type NoteProperty ` -Name DeviceID -Value $source.DeviceID $system | Add-Member -Type NoteProperty ` -Name DriveSize -Value ($source.DriveSize) $system | Add-Member -Type NoteProperty ` -Name UsedSpace ` -Value ($source.DriveSize - $Source.FreeSpace) $system | Add-Member -Type NoteProperty ` -Name FreeSpace -Value ($source.FreeSpace) $SystemInfo += $system}
Jak vidíte, prvním krokem je vytvoření prázdného pole (@()) a jeho přiřazení do proměnné $SystemInfo. Nakonec do tohoto pole přidáte vlastní objekty.
Poté pomocí rutiny Import-CSV importujete data do proměnné $SourceData. Pro toto cvičení je textový soubor pojmenován SourceData.txt a uložen do složky C:\DataFiles. Rutina Import-CSV načte každý řádek jako samostatný objekt a uloží jej do proměnné $SourceData. V tuto chvíli byste mohli tuto proměnnou použít pro přístup k datům, ale neměli byste kontrolu nad členy obsaženými v objektu, ani byste nemohli členy přidávat.
Dalším krokem je tedy vytvoření smyčky foreach, která vám umožní vytvořit vlastní objekt pro každý řádek v textovém souboru. Podmínka foreach ($source v $SourceData) určuje, že každý řádek v $SourceData má být přiřazen proměnné $source, jak kód iteruje přes smyčku foreach. Logika definovaná v bloku skriptu foreach (uzavřená v kudrnatých závorkách) pak proběhne pro každý řádek jednou, přičemž během každé iterace bude použit jiný objekt $source. (Další informace o vytváření smyčky foreach naleznete v tématu about_ForEach v síti PowerShell TechNet.)
Podívejme se blíže na blok skriptu foreach. První příkaz vytvoří počáteční objekt a uloží jej do proměnné $system, jak jste viděli v předchozích příkladech. Dále je proměnná $system předána příkazu Add-Member, aby se vytvořila první vlastnost poznámky. Jedná se o poněkud jiný formát, než jaký byl použit dříve. Místo toho, abyste do příkazu Add-Member zahrnuli parametr -InputObject, jednoduše do příkazu přivedete proměnnou $system. Tím dosáhnete stejných výsledků, jaké jste viděli v předchozích příkladech příkazů Add-Member. Tento přístup jsem zde použil pouze proto, abych demonstroval ještě jeden způsob, jakým prostředí PowerShell umožňuje přidávat členy.
Pro hodnotu příkazu Add-Member použijete proměnnou $source pro volání vlastnosti Computer, která odpovídá poli Computer ve zdrojových datech. Druhý příkaz Add-Member funguje stejným způsobem s tím rozdílem, že získává data z vlastnosti DeviceID. Všimněte si, že vlastnost Memory není zahrnuta. Při vytváření vlastního objektu můžete určité vlastnosti vynechat nebo je zařadit v jiném pořadí.
Třetí příkaz Add-Member funguje stejně jako první dva, s tím rozdílem, že přistupuje k vlastnosti DriveSize. Protože možná budete chtít s tímto údajem pracovat jako s číselnou hodnotou, nikoli jako s řetězcem, příkaz explicitně převede údaj na číslo. Toho dosáhnete tak, že před název vlastnosti uvedete, že chcete datový typint, a pak celý výraz vlastnosti uzavřete do závorek.
Čtvrtý příkaz Add-Member dělá něco trochu jiného. Vytvoří vypočítaný člen, který odečte hodnotu FreeSpace od hodnoty DriveSize, aby určil množství využitého prostoru. Opět se před název vlastnosti vloží a celý výraz se uzavře do závorek. Možnost vytvořit vypočtenou vlastnost je jedním z hlavních důvodů, proč byste mohli chtít vytvářet vlastní objekty.
Závěrečný příkaz Add-Member funguje stejně jako třetí, s tím rozdílem, že získává údaje z vlastnosti FreeSpace.
Závěrečný příkaz v bloku foreach skriptu přidá aktuální objekt $system do pole $SystemInfo. Všimněte si, že operátor += slouží k tomu, aby se při každé iteraci cyklu přidal nový objekt $system, aniž by se cokoli přepsalo.
Po spuštění kódu v Listingu 4 můžete zavolat proměnnou a zobrazit její obsah. Obrázek 7 ukazuje částečný seznam dat nyní uložených v poli $SystemInfo.
Konkrétně ukazuje data pro prvních sedm objektů v poli, což odpovídá prvním sedmi řádkům dat v původním textovém souboru. Každé seskupení představuje jeden z objektů přidaných do pole $SystemInfo. To, že jste vytvořili objektové pole, si můžete ověřit pomocí metody GetType pro získání typu proměnné:
$SystemInfo.GetType()
Pokud tento příkaz vrátí hodnotu BaseType System.Array, proměnná $SystemInfo je skutečně objektové pole schopné pojmout vlastní objekty. Tuto proměnnou pak můžete použít k manipulaci s daty, jak uznáte za vhodné. Například můžete proměnnou předat příkazu Sort-Object, aby se data seřadila sestupně na základě hodnot FreeSpace:
$SystemInfo | Sort FreeSpace -Descending
V tomto případě příkaz používá alias Sort pro odkaz na rutinu Sort-Object a obsahuje vlastnost FreeSpace a parametr -Descending. Jak vidíte na obrázku 8, objekty jsou nyní seřazeny podle hodnot FreeSpace, přičemž největší množství volného místa je uvedeno jako první. Opět se jedná pouze o částečný seznam.
Data můžete seřadit také na základě více sloupců. Například můžete data seřadit nejprve podle vlastnosti Počítač a poté podle vlastnosti Volné místo, a to sestupně:
$SystemInfo | Sort Computer, FreeSpace -Descending
Jak se dalo očekávat, výsledky jsou nyní mnohem odlišnější, jak ukazuje obrázek 9.
Jedním z důsledků seřazení sloupců tímto způsobem je, že hodnoty Computer i FreeSpace jsou seřazeny sestupně. Rutina Sort-Object neumožňuje jednoduše seřadit jeden sloupec vzestupně a druhý sestupně. Pokud zadáte parametr -Descending, budou všechna data seřazena v tomto pořadí. Toto omezení však můžete obejít tak, že pro každou vlastnost vytvoříte výrazy, které určují, jak tyto hodnoty seřadit. Například následující příkaz seřadí nejprve podle vlastnosti Computer vzestupně a poté podle vlastnosti FreeSpace sestupně:
$SystemInfo | Sort ` @{Expression="Computer"; Descending=$false}, @{Expression="FreeSpace"; Descending=$true}
První výraz Sort-Object nastaví vlastnost Expression na Computer a vlastnost Descending na $false. Druhý výraz nastaví vlastnost Expression na FreeSpace a vlastnost Descending na $true. (Proměnné $true a $false jsou vestavěné systémové proměnné, které poskytují logické hodnoty true a false 1, resp. 0). Každý výraz pak musíte uzavřít do kudrnatých závorek a před každou otevírací závorku umístit symbol at (@). Nyní budou data seřazena v požadovaném pořadí, jak ukazuje obrázek 10.
Může se to zdát jako přehnaná informace na téma třídění, ale poukazuje to na flexibilitu práce s objekty v poli. A rozhodně nejste omezeni pouze na rutinu Sort-Object. Například následující příkaz předává proměnnou $SystemInfo rutině Where-Object:
$SystemInfo | Where DriveSize -gt 250 | Sort FreeSpace -Descending
V tomto případě příkaz používá alias Where pro odkaz na rutinu Where-Object. Kromě toho určuje, že hodnota DriveSize musí být větší než 250, aby byla zahrnuta do výsledků. (V prostředí PowerShell se pro operátor větší než používá -gt.) Výsledky splňující tato kritéria jsou předány do rutiny Sort-Object, takže data jsou zobrazena ve správném pořadí.
Seřazená data můžete předat i do příkazu Select-Object, například takto:
$SystemInfo | Where DriveSize -gt 250 | Sort FreeSpace -Descending | Select -First 5
Tento příkaz používá rutinu Select-Object (na kterou odkazuje alias Select), aby vrátil pouze prvních pět řádků sady výsledků. Jak vidíte, po přidání vlastních objektů do pole $SystemInfo máte řadu možností, jak s těmito objekty pracovat.
Využití vlastních objektů
Vytváření vlastních objektů v prostředí PowerShell je z větší části poměrně jednoduchý proces. Pokud je s tím spojena nějaká složitost, obvykle vyplývá z hodnotových výrazů, které definujete pro vlastnosti poznámek nebo metody skriptů. Výrazy v těchto příkladech jsou ve srovnání s typy výrazů, které můžete v prostředí PowerShell vytvářet, poměrně jednoduché. Přesto by vám to, co jste zde viděli, mělo poskytnout základy potřebné pro vytváření vlastních objektů. Při efektivním použití mohou být výkonnou součástí vašich skriptů PowerShell, ať už vytváříte jednotlivé objekty, přidáváte je do pole nebo je používáte jiným způsobem. Můžete například vytvořit vlastní objekty v rámci profilu prostředí PowerShell, aby byly k dispozici při každém spuštění nové relace. Způsob použití vlastních objektů ve skriptech je na vás. Vězte jen, že vlastní objekt je účinný a flexibilní nástroj, který může sloužit mnoha vašim potřebám při tvorbě skriptů.
Další informace o vytváření vlastních objektů v prostředí Windows PowerShell najdete v článku Billa Stewarta „Vytváření vlastních objektů v prostředí Windows PowerShell“.