čtvrtek 7. ledna 2010

Recenze: Windows PowerShell 2.0 Best Practices

K Vánocům jsem si pořídil novou knihu o PowerShellu – Best Practices. Autorem je Ed Wilson AKA Scripting Guy. Rozhodně se nejedná o žádnou brožuru do kapsy (narozdíl od například PowerShell Administrator’s Pocket Consultant), má 752 stran a váží víc než můj netbook.

Kniha je rozčleněna do pěti částí (17. kapitol + 6 příloh) a obsahuje CD, na kterém jsou popisované skripty a několik dalších informací. Kniha není určena pro začátečníky. Předpokládá, že znáte základy a ve skriptech nevysvětluje použité konstrukce. Na druhou stranu – pokud jste alespoň o trochu chápavější než dlažební kostka, nebudete mít většinou s pochopením problém a chybějící informaci si dohledáte například v nápovědě.

Na stránkách Microsoft Press si můžete přečíst, jak je kniha členěna (anglicky).

Část 1. – Úvod

Tato část je rozdělena do čtyř kapitol. První dvě se věnují opravdu základům PowerShellu. Novým cmdletům (práce s WMI, *-Computer, …), případně novým parametrům starých cmdletů (např. parametr -ComputerName). Další dvě kapitoly se věnují (pro mne překvapivě) práci s Active Directory včetně ukázky práce s databází nebo Excelem (pro účely importu dat). Pro všechny příklady jsou bohužel použity akcelerátory [ADSI] a [ADSiSearcher] a není zde zmínka od AD cmdletech. Chápu, že ne všichni mají doménu s Windows 2008 R2 serverem, ale osobně bych tyto dvě zmiňované kapitoly oželel. V této části se objevuje i další neduh – osobně nepotřebuji výpisy na tři strany, které dostanu na konzoli jednoduchým příkazem, např. Get-WmiObject Win32_Process | Get-Member.

Část 2. – Plánování

Zde začínám opět výtkou. V knize nazvané Best Practices bych nečekal použití RegRead. Proč??? Pokud lidem ukážeme, že mohou v PowerShellu “používat syntaxi z VBS”, těžko pak budou hledat důvod pro přechod. V prvním příkladu této kapitoly je krásně ukázán největší neduh knihy – opět se vracím k VBS – PowerShell skript s VBS syntaxí. Uvedu jej celý:

$path = "HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine"
$psv = Get-ItemProperty -Path $path
$psv.RunTimeVersion

Chápal bych tento příklad v kontextu vysvětlení, že jej lze napsat lépe (i bez ztráty čitelnosti), například takto:

Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine" -Name RunTimeVersion

nebo po prostudování nápovědy takto:

Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine" RunTimeVersion

a pokud chcete opravdu jen číslo verze, není problém použít následující kód:

(Get-ItemProperty -path HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine).RunTimeVersion

Zbytek kapitoly se věnuje zjišťování verzí .NETu nebo operačního systému. V další kapitole se mluví a profilech, vytváření funkcí, proměnných, PSDrives (mimochodem tomuto tématu se věnuji v dalším díle seriálu pro TechNet Flash). Další kapitola ukazuje WMI, registry (konečně je zde ukázáno “správné” řešení příkladu z první kapitoly, ale s poznámkou, že řešení je matoucí – nechápu!) Na konci kapitoly je letmo zmíněna .NET třída System.Math a zbytek kapitoly okupuje opět COM (příklad tvorby CAB souboru).

V poslední kapitole je ukázán cmdlet Invoke-Command a poté opět Active Directory. [ADSISearcher], ds* příkazy (proč?) a konečně zmínka a AD cmdletech (ukázán je ovšem pouze jediný). Konec kapitoly je věnován benefitům skriptů.

Část 3. – Design

V návrhu funkcí jsou probírány například vstupní parametry nebo filtry a poté navazuje kapitola o tvobě nápovědy, včetně třinácti pravidel pro psaní efektivních komentářů. V následující kapitole jsou probrány moduly a také tvorba nápovědy pro funkce (?). V další kapitole je ukázána práce se vstupem a výstupem a popsány novinky v PowerShellu v2 z hlediska advanced functions. Ukázána je dále práce s heslem (uložení do souboru, registru, …) a výstupy (soubor, obrazovka). Poslední kapitola se věnuje ošetřování chyb ve skriptech. Osobně bych očekával větší ukázku použití konstrukce try-catch-finally.

Část 4. Testování a nasazení

Popisuje testování z různých pohledů, jako například rychlost nebo komplexnost. Dále jsou popsány parametry Debug a WhatIf. V části nazvané spouštění skriptů je ukázáno jak změnit ExecutionPolicy nebo pracovat s číslování verzí. Vyloženě výsměchem je část nazvaná Understanding Code Signing – na jedné straně se dozvíte, že existuje cmdlet Set-AuthenticodeSignature, ale o jeho použití se nedozvíte vůbec nic (zato jsou ukázány dva screenshoty).

Část 5. – Optimalizace

Tato část je rozdělena na dvě kapitoly. V první je ukazováno logování do souboru, event logu a registru. Poslední kapitola se věnuje debugování pomocí Set-PSDebug a cmdletů *-PSBreakpoint.

Přílohy

Obsahují kapitoly: Seznam cmdletů, Common Verbs, Useful COM Objects, Useful WMI Classes, Useful .NET Classes, WMI Error Messages.

Shrnutí mých dojmů

Z prědchozích řádek je asi jasné jaký bude můj závěr. Musím říct, že kniha mě zklamala. Měl bych dvě hlavní výtky: 1) Knihou prostupuje stín VB Scriptu 2) Obsah mi přijde řazený značně chaoticky – některá témata jsou ukázána na různých místech a pokud si chcete přečíst informace (např. o AD), najdete je “rozházené” po knize. Na to množství stran, si myslím, že užitečných informací je v knize žalostně málo. Pokud čtete help a sledujete blogy, moc nového si neodnesete. Rozhodně se nejedná o žádné Best Practices. Na druhou stranu, každá propagace PowerShellu je dobrá a pokud tato kniha přítáhne k PowerShellu víc lidí, bude to jen dobře. Dobrým počinem knihy jsou i vložené "Inside Track" od lidí jako např. Jeffrey Snover, Brandon Shell a další.

Za oficiální cenu 60 dolarů (38 na Amazonu) si nemyslím, že je tato kniha rozumnou investicí. Rozhodně bych spíše doporučil počkat do konce ledna na Windows PowerShell 2.0: TFM od Sapien Press ($35 za ebook nebo $42 za tištěnou knihu).

4 komentáře:

stej řekl(a)...

AD cmdlety vs. akceleratory? Divne, cekal bych, ze bude (pokud mozno) pouzivat v podstate nativni veci jazyka (coz jsou cmdlety).
Neni to mozna tim, ze nejsou primo v Posh z instalace? (predpokladam, get-command mi je nevratil; jinak s tim nedelam). Aha, v dalsim odstavci ctu, ze se o nich zminuje, hmm...

==
RegRead - to je nejaka vbskovina? :) Fuj.

==

K tomu největšímu neduhu:
1) u sebe bych se nedivil, ze neznam parametr -Name (duvod viz bod #2). Pokud ale nevi Ed, je to spatne.

2) jsem programator, takze pro me je nativnejsi syntaxe '(get neco).property' (vraci hodnotu) nez 'get neco -name property' (vraci PSCustomObject) - tj. tak divny mi to neprijde. Duvod: vetsinou pracuju primo s hodnotami promennych nez s jejich zabalenymi verzemi v nejakych Ps(Custom)Object.

V pripade ale, ze tech props muze byt hodne, tak je fakt, ze neuvedeni -name muze mit vliv na vykon, co?

==
ta tvorba napovedy pro funkce bude ty s [CmdletBinding()]?

==
u security (podpis kodu) bych asi cekal vice info... (proc, jak na to, pripadne jak na automaticky podpis jako mel tusim Jayukl). A taky info, proc to nemit uplne vypnuty a jak a kdy vypinat. Ja to mam porad unrestricted (ale nejsem cilova skupina PowerShellu).

==
pokud je tam vicekrat nejaky vypis (jako z Get-WmiObject Win32_Process | Get-Member), neni divu, ze ma tolik stran ;)
--------

Osobne se tesim na Posh in Action, ale kdesi jsem videl, ze se snad ma zpozdit :(
Diky za recenzi. Sice bych si ji nekoupil, ale aspon nemusim litovat...

makovec řekl(a)...

Diky za comment.

ad 1) Podle me je to tim, ze proste ve VBS se to delalo takhle a s Edem se to tahne. Ja bych cekal bud zadny AD (coz by ciste PowerShell knizce davalo smysl) nebo cmdlety.

ad 2) jojo :)

ad 3) Nevim, jestli nevi - spis na to fakt neni zvyklej - a jsme zase u VBS. Pro me osobne (ac neprogramatora) se casem taky stalo nativnejsi (hezky cesky slovo :) "(get neco).property" z duvodu, ktery zminujes - vetsinou chci nejakou hodnotu a ni dal pracuju. V pripade vice properties asi budes mit pravdu, protoze (get).prop vrati celou sadu a pak vybere konkretni prop.
Vsuvka: Ted jsem to zkousel a u WMI je to tak - s parametrem -Property zhruba 2,5x rychlejsi nez pri (get).prop

ad 4) napoveda typu <# .SYNOPSIS - .EXAMPLE #> pokud me pamet neklame, tak CmdletBinding, jsem v cely knize nepotkal (ale ruku do ohne bych za to nedal)

ad 5) skoda mluvit. I kdyz o ExecutionPolicy tam toho bylo o trochu vic.

ad 6) co dodat

Na PowerShell in Action fakt nic nema - pro zacatecnika je hodne nestravitelna (vim, cetl jsem ji jako prvni :), ale po par mesicich uz je to lepsi. I tak je to ale knizka, kterou stale nechapou celou (ale napr. vic nez TAOCP :))

stej řekl(a)...

S tim [CmdletBinding()] - vypada to, ze neni k napovede potreba. Jen pro upresneni, trochu me to asi zmatlo ;)

Btw. projit tu knizku v tak kratkym case, to teda klobouk dolu.

makovec řekl(a)...

Dnes uveřejnil Ed Wilson na webu MS Pressu následující příspěvek: http://blogs.msdn.com/microsoft_press/archive/2010/01/14/ed-wilson-developing-windows-powershell-best-practices-book.aspx

Jen pro info, jedná se o kompletní odpověď, kterou mi poslal před pár dny mailem jako reakci na mé hodnocení knihy. Myslím, že je zajímavé si ji přečíst.

Některé z reakcí chápu, některé už méně, nicméně naše konverzace pokračuje dál, takže možná přijdu opět s nějakým updatem.