Seriál Windows PowerShell: PowerShell v3 (část 29.)

Jak jsem slíbil minule, podíváme se dnes na novou verzi PowerShellu – v3. Nejprve krátce něco k dostupnosti na různých verzích Windows.

PowerShell v3 je standardní součástí Windows 8 a Windows Serveru 2012 (všechny edice). Doinstalovat jej lze na starší operační systémy následovně:

  • Windows 7 SP1
  • Windows Server 2008 SP2
  • Windows Server 2008 R2 SP1

Stejně jako v předchozí verzi, je i nyní PowerShell součástí balíčku nazvaného Windows Management Framework 3.0. Tento balík obsahuje ještě WMI a WinRM. Pro instalaci je potřeba mít nainstalován .NET Framework 4.0. Více se můžete dočíst přímo na stránce, kde se dá WMF stáhnout.

A nyní již k některým novinkám. Je jasné, že v dnešním článku nelze pokrýt všechny, ale vybral jsem ty, které považuji za nejzajímavější z mého pohledu. Samozřejmě si o dalších povíme v následujících dílech TechNet Flashe.

$PSDefaultParameterValues

Tuto nově zavedenou proměnnou mám mezi svými TOP 3. Vezměte si následující situaci. Používáte často cmdlet Export-Csv a nelíbí se vám, že je na začátku každého souboru uvedena informace o exportovaném typu, například:

PS C:\> Get-Process powershell | Select-Object Name, Company, Id | Export-Csv C:\temp\proc.csv
PS C:\> Get-Content C:\temp\proc.csv
#TYPE Selected.System.Diagnostics.Process
"Name","Company","Id"
"powershell","Microsoft Corporation","7040"

Export-Csv obsahuje parametr NoTypeInformation, takže můžete použít

PS C:\> Get-Process powershell | Select Name, Company, Id | Export-Csv C:\temp\proc.csv –NoTypeInformation

a ve výsledném souboru se typ neobjeví. Jenomže uvádění parametru může být po delším čase otravné. Abychom nemuseli tento parametr uvádět, můžeme využít proměnnou PSDefaultParameterValues. Ta určuje vaši vlastní hodnotu parametru pro daný cmdlet. V našem případě můžeme určit, že parametr NoTypeInformation bude u cmdletu Export-Csv nastaven na True a nebudeme ho tedy muset uvádět.

$PSDefaultParameterValues = @{ 'Export-Csv:NoTypeInformation'=$True }

Na příkladu je vidět, že definujeme hash tabulku, kde uvádíme jméno cmdletu, parametr a jeho (novou) standardní hodnotu. Toto nastavení je platné po dobu běhu PowerShellu, takže je ideální umístit změny do vašeho profilu. Pokud tedy nyní zkusíme znovu předchozí příklad

PS C:\> $PSDefaultParameterValues = @{ 'Export-Csv:NoTypeInformation'=$True }
PS C:\> Get-Process powershell | Select-Object Name, Company, Id | Export-Csv C:\temp\proc.csv
PS C:\> Get-Content C:\temp\proc.csv
"Name","Company","Id"
"powershell","Microsoft Corporation","7040"

Vidíte, že i bez uvedení NoTypeInformation, máme ve výsledném souboru informace bez uvedení typu. Já mám například ve svém profilovém souboru pro Export-Csv následující záznam:

$PSDefaultParameterValues = @{
    'Export-Csv:Delimiter'=';'
    'Export-Csv:NoTypeInformation'=$true
}

tím určuji nejen, že nechci ukládat informace o typu, ale zároveň určuji, jaký znak použiji jako oddělovač. Jak víte, v českém prostředí je standardně používán středník. Předchozím zápisem mám zajištěno, že veškeré mé výstupy do CSV použijí jako oddělovač právě středník a Excel jiných lidí si s ním poradí bez problémů.

To byla jen krátká ukázka použití, pokud vás zajímá více – a já myslím, ze by mělo – podívejte se na nápovědu dostupnou na https://technet.microsoft.com/en-us/library/hh847819.aspx

Update-Help

Jak je vidět i v banneru mistra Skriptíka, Update-Help může způsobovat lehkou bolest hlavy. Pojďme se na tuto novinku podívat podrobněji. Již od PowerShellu verze 1 byl problém s neaktuální nápovědou. Z různých historických důvodu nebylo možné po uvolnění produktu jakýmkoli způsobem nápovědu aktualizovat. Ve verzi 2 jsme měli možnost použít parametr Online u cmdletu Get-Help. Nicméně soubory nainstalované lokálně na počítači jsme opět nemohli aktualizovat. Proto přišel PowerShell tým s možností aktualizovatelné nápovědy (v originále updatable help).

Na čistě nainstalovaných Windows (lépe řečeno – po instalaci PowerShellu) se po zavolání Get-Help zobrazí nápověda pouze v základním tvaru, generovaném z metadat cmdletu. Pro aktualizaci je potřeba (jako administrátor) zavolat Update-Help. Tento cmdlet následně provede několik akcí:

  • Zjistí všechny instalované moduly (dívá se do cesty PSModulePath).
  • Podle HelpUri zjistí cestu k online verzi nápovědy (v PSMAML formátu).
  • Zjistí, jestli je nainstalována poslední verze nápovědy.
  • Stáhne CAB soubor nápovědy (pokud je potřeba) a rozbalí jej.
  • Ověří, zda jsou soubory správné.
  • Nainstaluje soubory do správných adresářů.

Shodou okolností byla hostem jednoho z posledních dílů PowerScripting Podcastu June Blender. Ta je zodpovědná za tvorbu nápovědy v PowerShellu již mnoho let. Pokud si chcete tento díl poslechnout, najdete jej na adrese https://powerscripting.wordpress.com/2012/10/02/episode-203-june-blender-from-microsoft-talks-about-getting-help/

June mimo jiné zmiňovala, že Update-Help patří (pro mne překvapivě) k nejsložitějším cmdletům v PowerShellu. Více si o možnostech aktualizace nápovědy můžete přečíst TechNet stránkách věnovaných jednotlivým cmdletům: Update-Help , Save-Help , Get-Help nebo v tematické nápovědě about_Updatable_Help.

Pro mne osobně je ideální scénář, kdy o víkendu spustíte automaticky Save-Help a jednotlivé počítače mají nastavenou v PowerShell profilu kontrolu pomocí Update-Help například každé pondělí. Tím máte zajištěnou dostupnost aktuální verze nápovědy na vašich počítačích.

Nové možnosti vytváření vlastních objektů

V předchozích dílech jsme se věnovali tvorbě vlastních objektů. Ukažme si jednoduchý příklad.

PS C:\> New-Object -TypeName PSObject -Property @{
>> a='jedna'
>> b='dva'
>> c='tri'
>> d='ctyri'
>> } | Format-Table -AutoSize
>>

a b d c
- - - -
jedna dva ctyri tri

toto chování by nás již nemělo překvapit. Pokud bychom chtěli pořadí vlastností tak, jak jsme je v objektu definovali, bylo by potřeba použít cmdlet Select-Object

PS C:\> New-Object -TypeName PSObject -Property @{
>> a='jedna'
>> b='dva'
>> c='tri'
>> d='ctyri'
>> } | Select-Object a,b,c,d | Format-Table -AutoSize
>>

a b c d
- - - -
jedna dva tri ctyri

Naštěstí existuje ve verzi 3 lepší možnost – použití třídy PSCustomObject:

PS C:\> [PSCustomObject] @{
>> a='jedna'
>> b='dva'
>> c='tri'
>> d='ctyri'
>> } | Format-Table -AutoSize
>>

a b c d
- - - -
jedna dva tri ctyri

Pro mne osobně je toto velké ulehčení práce, protože u všech mnou vytvářených objektů chci mít zajištěné pořadí jednotlivých vlastností.

Stejná technika jde použít i v případě vytváření objektů, např. třídy PSSessionOption:

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

A tento objekt můžeme dále využít v cmdletech využívajících tento typ objektu.

Dnes jsme si ukázali úplný začátek naší cesty po PowerShellu v3. Pokud by vás zajímala nějaká specifická část nového PowerShellu, nechte komentář pod článkem, příště se můžeme věnovat i vašemu tématu.

David Moravec, MVP