neděle 30. listopadu 2008

Get-PSNews |? {$_.CreationTime -lt "7days"}; Write-Host "Týden 48"

Uplynulý týden byl tentokrát na události hodně bohatý. Vzhledem k tomu, že jsem se k sepisování dostal až ve čtvrtek, doufám, že na nic důležitého nezapomenu. Čekají mne dva dny (těžce pracovní) dovolené, takže jsem ve chvíli (opravdového) volna začal pracovat na dvou nových sériích článků. Jedna o operátoru -f a druhá se bude věnovat regulárním výrazům. Doufám, že se mi taky podaří dokončit rozpracovaný článek na téma Get-Member. Co se dělo ve světě PowerShellu v cizině?
  • PowerScripting Podcast dospěl ke kulatým padesátinám. Tentokrát byl hostem Ed Wilson, jeden z Microsoft Scripting Guys. Rozhovor byl hodně zajímavý a občasná střelba do vlastních řad snad znamená, že se Script Centrum dočká podstatného PowerShell redesignu.
  • Hugo Peeters pokračuje v sérii skvělých skriptů. Show-Tree dokáže zobrazit stromovou strukturu jakékoli PS jednotky (PSDrive), tedy např. i registry nebo Active Directory.
  • Na PowerShell scripts byly uveřejněny tři nové skripty. Get-DomainRole, Determine-Domain, Get-LocalGroups.Dva z nich používají pro výstup operátor -f.
  • Jonathan Medd udělal update PowerPacku pro WSUS. Pokud WSUS používáte a tento PowerPack jste ještě nezkoušeli, máte co dohánět.
  • Jak provést příkaz proti všem počítačům v Active Directory? Odpověď v článku na Concentrated Technology. Porovnejte čisté PowerShell řešení proti pouřití Quest AD cmdletů. Jen pro info: jedno z dalších témat, které jsem začal zpracovávat je porovnání různých přístupů do AD (a to z různých hledisek jako je například rychlost odpovědi nebo náročnost na zápis).
  • Jak otestovat existenci objektu v Active Directory uvádí Richard Siddaway.
  • James Brundage uvádí, jaký je při vytváření objektů rozdíl v použití Select-Object a Add-Member.
  • Marco Shaw uveřejnil nový termín pro Windows PowerShell Virtual User Group Meeting #7 - předchozí byl zrušen z důvodu problémů s  Live Meeting servery.
  • Jak vytvořit 20.000 uživatelů v AD? S PowerShellem jednoduše.

sobota 29. listopadu 2008

Operátor formátování - 1. část

Poslední dobou jsem hodně používal operátor -f, nazývaný operátor formátování. Rozhodl jsem se jej tedy zpracovat do série (zatím plánované na čtyři části), ve které bych rád popsal jeho možnosti použití. Abyste nemuseli kód v článku kopírovat ručně, ke každému dílu uveřejním zdroj ve formě souboru TXT použitelného pro skript Start-Demo. První díl můžete stahovat zde.

Operátor slouží k úpravě výstupu např. skriptů. Má dva "parametry" říkající CO chceme formátovat a JAK to chceme formátovat. Pod položkou CO si představte text, číslo, proměnnou nebo třeba metodu .NET Frameworku. Zápis syntaxe je následující:

JAK_FORMATOVAT -f CO_FORMATOVAT

Na levé i pravé straně může být více příkazů, můžete tedy formátovat výstup například pěti proměnných. Nejjednodušší použití jsou například tato:

PS C:\> "{0}" -f "David"
David
PS C:\> "{0} {1}" -f "David", "Martin"
David Martin
PS C:\> "{1} & {0}" -f "David", "Martin"
Martin & David

V prvních dvou příkladech ještě pořádně neformátujeme, ale je vidět použítí. Na levé straně uvádíme ve složených závorkách index textu ze strany pravé. Stejně jako pole se číslování provádí od nuly. Ve druhém řádku tedy vezmeme text "David" (index 0) poté text "Martin" (index 1) a v tomto pořádí je pošleme na standardní výstup. Třetí příklad už mírně výstup mění. Vezme vstupní texty, prohodí jejich pořadí a vloží mezi ně znak &. Uhádnete, co bude výstupem tohoto řádku?

"{4}{4}{1}{5}{0}{3}{0}{5}{2}" -f "e","ka","l","p","po","t"

Práce s indexy je prostě krásná :) Správná odpověď je popokatepetl. Zatím jsme pracovali pouze s pevně danými texty. Mohli jsme samozřejmě postupovat i následujícím způsobem:

PS C:\> $david = "David"
PS C:\> $martin = "Martin"
PS C:\> "{1} & {0}" -f $david, $martin
Martin & David

Kdyby operátor uměl pouze prohazovat indexy, nebyla by práce s ním tak pěkná (resp. byla by pěkná, ale nikdo by ho nepoužíval, protože by byl nadbytečný). Obecná syntaxe levé časti operátoru je trošku více komplikovaná:

{index[,zarovnani][:formatovaciRetezec]}

Prozatím jsme používali pouze index. Ve druhé a třetí části popisu operátoru formátování se podíváme na formatovaciRetezec. V poslední části si ukážeme zarovnani a uděláme zároveň závěrečné shrnutí.

Abyste se těšili na příště, podívejte se na následující příklad. V něm už využíváme formatovaciRetezec a zároveň je vidět, že výstup operátoru formátování můžeme uložit do proměnné pro pozdější použití.

PS C:\> $procesy = Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
PS C:\> foreach ($p in $procesy) {
>> $cpu="{0:###.#}" -f $p.CPU
>> $ws="{0:###.##}" -f ($p.WS/1MB)
>> Write-Host $p.ProcessName `t $cpu `t $ws
>> }
>>
System 241,9 1,23
RSSBandit 156,5 46,15
Rtvscan 93,2 60,21
EZEJMNAP 83,4 3,61
svchost 75,6 26,4
explorer 70,8 25,77
vmware-authd 63,9 4,78
sametime75 54,7 98,18
wmplayer 52 7,19
AcroRd32 46,9 79,31
PS C:\>


Celou druhou část se budeme věnovat formátování datumu a času a budeme si ukazovat jak modifikovat výstup cmdletu Get-Date.

pondělí 24. listopadu 2008

Použití Write-Progress

Na školení PowerShellu se jeden z kolegů ptal, jak udělal /\/\o\/\/ progress bar při instalaci PowerTab. Pro ty z vás, co jej neznají (myslím progress bar :) - jedná se o tento pruh



který je umístěn v horní části okna PowerShellu. Při delším načítání (zapisování, kopírování, ...) dat je to vhodná pomůcka pro uživatele. V každém okamžiku ví, kde přesně se v čase nachází. Abyste nemuseli něco takového sami vymýšlet, je přímo v PowerShellu cmdlet Write-Progress. Pojďme se podívat, jak funguje.

Write-Progress má dva povinné parametry:
  • activity - řetězec, který říká, jaká aktivita probíhá (na obrázku výše je to Loading records ...)
  • status - popisuje konkrétní (aktuální) stav aktivity; v našem případě 136 of 633.
Pokud použijete pouze tyto dva parametry, můžete vyzkoušet jednoduché zobrazení hodnoty čítače (aby bylo něco vidět, přidal jsem čekání 100ms před každou změnou)

for($i=0; $i -le 50; $i++) {
Start-Sleep -m 100
Write-Progress "Ukazuji promennou..." $i }

Výsledkem je následují výstup


Takovýto základní ukazatel nám asi ve většině případů nebude stačit. Je dobré dát uživateli vědět, jak dlouho bude ještě čekat na dokončení operace. K tomu slouží další dva parametry (musí se uvádět jejich jméno)
  • percentComplete - ukazuje formou "teploměru", kolik procent je již hotovo (viz úplně první obrázek)
  • secondsRemaining - počet vteřin do skončení operace
Ukažme si jednoduchý příklad použití druhého parametru

for($i=0; $i -le 10; $i++) {
Start-Sleep 1
$sec = 10-$i
Write-Progress "Ukazuji promennou..." $i -secondsRemaining $sec }

Ve smyčce for zvyšujeme hodnotu proměnné i do deseti a zároveň zobrazujeme počet vteřin zbývajících do konce operace.


Pro úplné popsání Write-Progress nám ještě chybí následující parametry
  • id - specifikuje jedinečné ID progress baru. Lze použít pro zpětné volání.
  • currentOperation - popisuje aktuální operaci. Je více specifický než status.
  • parentId - aktivita nadřazená té aktuální
  • completed - standardně false, pokud je true nezobrazuje se progress bar
  • sourceId - zdroj záznamu
Pokud chcete vidět nějaký smysluplný příklad stáhněte si zdrojové kódy ke knize Windows PowerShell: TFM a koukněte se na P093-InventoryProgress.ps1.

Write-Progress můžete ovládat několika následujícími parametry:
  • $ProgressPreference - může nabývat hodnot SilentlyContinue, Continue, Stop, Inquire. Pokud nastavíte SilentlyContinue, progress bar nebude vidět (stejné jako kdybyste pro každý nastavili -completed = $true).
  • $host.PrivateData.get_Progress*, $host.PrivateData.Progress* - nastavují/zobrazují barvu progress baru.

První obrázek v tomto článku vznikl, při načítání dat z databáze Lotus Notes. V současné době používám novější verzi, která navíc zobrazuje data načítaného záznamu

Write-Progress -Activity "Loading records..." -Status "$i of $DomNumOfDocs" -id 1 -CurrentOperation "$LNlastname" -PercentComplete ($i/$DomNumOfDocs*100)

neděle 23. listopadu 2008

Get-PSNews |? {$_.CreationTime -lt "7days"}; Write-Host "Týden 47"

Uplynulý týden nebyl na události nijak bohatý. Každopádně i kvůli jednomu zmiňovanému skriptu stál za to. Jenom musím říct, že obrázek generovaný pro 814 skupin je opravdu úděsný :-)

pondělí 17. listopadu 2008

Windows PowerShell™ v1.0: TFM®, 2nd Edition

Jak jsem již psal dříve, stal jsem se majitelem knihy Windows PowerShell TFM. Dostal jsem ji jako cenu za hodnocení PowerScripting Podcastu. Myslím, že spíš než kvalitou hodnocení, to bylo exotičností mého bydliště (myslím tím pro lidi z US) Vybral jsem si papírovou knihu a byl jsem velmi překvapen, když mi po 14 dnech přišel link na stažení PDF verze. Nicméně, jak se říká - darovanému koni na zuby nehleď. Ihned jsem se pustil do čtení. Další překvapení se dostavilo po několika dnech, kdy mi přišla i kniha papírová. Psal jsem zpět, jestli se nejedná o nějaký omyl, ale bylo mi pouze popřáno pěkné čtení. Takže mohu kombinovat čtení obou verzí knihy.

Knihu vydalo nakladatelství SAPIEN Press a nyní je v druhé edici. Existuje již edice třetí, ale ta se zabývá PowerShellem v2 a ještě není dostupná v papírové podobě. Papírová kniha stojí oficiálně 60 dolarů, ale v on-line obchodech ji můžete sehnat o mnoho levněji, např.: SAPIEN Press ($41,99) nebo Amazon ($37,79). Elektronická stojí na stránkách SAPIENu 33,99 dolarů. Která z verzí je lepší? Při rozdílu necelých deseti dolarů sázím já osobně na papírovou podobu. Je potřeba samozřejmě připočítat poštovné. Elektronická verze je zamčená a nejde tisknout. V patě každé stránky je vytištěn text, kde je napsáno, komu kniha náleží. Dost řečí, pojďme se podívat na obsah knihy.

Autoři knihy (Don Jones a Jeffery Hicks, oba PowerShell MVP) jsou v PowerShell komunitě dobře známí. Oba pracují pro SAPIEN jako "scripting gurus". Z předchozí věty je jasné, že jsou oba odborníky na slovo vzatými. Knihu rozdělili do čtyř částí:
  • Interaktivní používání PowerShellu
  • Skriptování v PowerShellu
  • Praktické příklady administrace Windows
  • Pokročilé techniky
První část se zabývá použitím konzole PowerShellu. Autoři ukazují základní techniky práce a nepouští se do žádných extrémnějších příkladů. I tak je tato část nabita množstvím informací a je to možná to nejlepší, co kniha obsahuje. 

Ve druhé části autoři popisují možnosti tvorby skriptů včetně používání např. regulárních výrazů. V závěru jsou popsány tipy pro tvorbu skriptů.

Třetí část je zaměřena na administrátory systému Windows a dává jim do ruky tipy pro práci se systémem. Jedná se například o práci se soubory, registry, službami, WMI nebo Active Directory.

Poslední, čtvrtá, část ukazuje pokročilejší témata a to včetně práce s COM objekty, .NET Frameworkem, XML dokumenty. Ukazuje například i tvorbu vlastních objektů nebo pohledů.

Nechci zde vyjmenovávat postupně všechny kapitoly, obsah je (včetně ukázkových kapitol) dostupný na stránkách knihy. Pro mne osobně byla kniha velice přínosná. Pro začátečníka je dle mého názoru stravitelnější než skvělá Payetova PowerShell in Action. Tu jsem začal číst před několika měsíci a nyní se k ní hodlám vrátit. Z knihy jsem měl pocit, že některé části byly psány s větší pečlivostí (možná rozdílný přístup autorů?). Občas jsem našel překlepy a objevil jsem i několik příkladů, ve kterých byly chyby. Ani to však nijak zásadně nesnížilo celkový dojem z knihy. Knize bych dal známku jedna a s klidným srdcem ji mohu doporučit jako vhodný zdroj pro studium PowerShellu.

Get-PSNews |? {$_.CreationTime -lt "7days"}; Write-Host "Týden 46"

Pravidlené týdenní novinky vychází nepravidelně trošku později. Vzhledem k dnešnímu státnímu svátku to snad nebude moc vadit. Celý minulý týden se v mém případě točil kolem školení PowerShellu, které jsem absolvoval. Pokud vás zajímá, co jsme probírali, podívejte se na články z minulého týdne - každý den jsem psal shrnutí. Já si právě stáhl poslední PowerScripting Podcast, jdu si uvařit kafe a pokusím se dohnat i nějaké další dluhy z minulého týdne. Přeji vám pěkný týden.
  • Právě vzniká online kniha o PowerShellu z klávesnice Dr. Tobiase Weltnera.
  • 48. epizoda PowerScripting Podcastu, tentokrát s Lee Holmesem.
  • Popis Here-String na stránkách Concentrated Technology. Rozhodně stojí za naučení a porozumění! Nedávno se tomuto tématu věnoval i Jeffrey Snover.
  • Krásné dvě funkce Translate-SID a Translate-ToSID zveřejnil Hugo Peeters ve svém blogu.
  • Záznam z panelové diskuse o PowerShellu na TechEdu.
  • /\/\o\/\/ uvedl odkazy na videa z TechEdu pohromadě + bonus.
  • V tomto blogu již několikrát zmiňovaný Jaykul se vrhl na tvorbu Wiki pro PowerShell. V současné době se Wiki začíná plnit a v diskusích se o ní hodně mluví. Uvidíme, kam to povede. Zatím se můžete podívat na krátký post obsahující i skript pro generování Wiki nápovědy přímo z help souborů PowerShellu.
  • Nová epizoda PowerScripting Podcastu, s pořadovým číslem 49.

pátek 14. listopadu 2008

Školení PowerShell - den pátý + shrnutí

Ráno jsme začali Modulem 10, Objekty COM a WMI. Všechny konstrukce známe a už používáme PowerShell ryze prakticky. Nejdříve jsme si ukázali, jak lze přes COM přistupovat na různé aplikace jako je například Internet Explorer nebo Excel. Ve druhé části modulu jsme se trošku podrobněji podívali na použití cmdletu Get-WmiObject a pan Malina nám ukázal některá jeho vylepšení v PowerShellu CTP2.

Před obědem jsme se věnovali Modulu 11, Chyby a ladění v PowerShellu. Ukázali jsme si parametr -ErrorAction, zachycování výjimek a použití cmdletu Set-PSDebug. Opět jsme se koukli na novinky ve verzi CTP2. V Modulu 13 jsme se podívali na Rozšíření PowerShellu (Modul 12 jsme prozatím přeskočili). Nebudu vyjmenovávat všechno, ale zmínili jsme se například o PSCX nebo PowerGUI.

Poslední - 14. modul se zabýval tématem Některé další možnosti PowerShellu. Probrali jsme "chuťovky", které byly zmiňovány v průběhu týdne a které se nevešly do žádného jiného modulu. Jednalo se o vzdálený přístup přes PowerShell, regulární výrazy a operátor -f.

Závěrečné zhodnocení kurzu
Tak skriptovací týden skončil. Rozhodně to nebyl ztracený čas. Šel jsem na kurz s tím, že některé věci budu vědět, ale že se i hodně naučím. Kladně hodnotím přístup pana Maliny. Jeho okamžitá reakce na dotazy (pokud ne okamžitá, tak v průběhu přestávek) a znalost PowerShellu obecně je velkou devizou kurzu. Postupovali jsme od základů, přes cmdlety až po složitější tématiku a myslím, že každý dokázal tempo v klidu udržet. Na kurzu jsem našel asi jedinou vadu - byl bych spokojen, kdyby trval asi tak měsíc :)

Na úplný závěr malé doporučení:

Get-MHD -WithChange | Where {$_.Station -eq "Koh-i-Noor"} | Out-Gopas