neděle 26. října 2008

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

  • Nevím, co jsem minulý týden dělal, že jsem zapomněl přidat jednu malou, ale "důležitou" změnu. V oficiálním PowerShell blogu se objevila zmínka, že v CTP3 bude opuštěn název cmdlet a bude dále nazýván funkcí. Více v Emit-XML.
  • Další UK PowerShell UG meeting 25.11. bude přenášen živě přes Live Meeting. Bude se převážně věnovat Práci s AD.
  • Diskuse v microsoft.public.windows.powershell mě navedla na možnost ovládání Windows Desktop Search přes PowerShell. Prvním je ovládání WDS 3.0 a druhým Get-WDS cmdlet. Zatím jsem nezkoušel kompatibilitu skriptů mezi verzemi 3.x a 4.0.
  • Ve středu proběhla online konference Quest Connect 2008. Zůčastnil jsem se několika přednášek z nichž nejzajímavější pro mne rozhodně byla Do Not Fear the Command Line: PowerShell Made Easy, která se zabývala PowerShellem a PowerGUI. Přednášky budou dostupné ke shlédnutí až do 9.dubna 2009.
  • Krátký popis Connect-QADService uveřejnil Brandon Shell na TurboChargeAD.org.
  • V blogu SAPIEN Technologies byly zveřejněny ZIP soubory z přednášek Jefferyho Hickse na konferenci TechMentor. Obsahují skoro 300 stran prezentací a 1300 řádek kódu a stojí rozhodně za shlédnutí.
  • Konečně jsem si stáhl knihu, kterou jsem vyhrál za recenzi PowerScripting Podcastu. Po rychlém prolétnutí a posléze přečtení 100 stránek (právě začínám číst kapitolu PowerShell Command-line Parsing) ji řadím na úroveň mých oblíbených PowerShell Cookbook a PowerShell in Action.

pátek 24. října 2008

Start-Demo

Před několika měsíci jsem v PowerShell blogu objevil moc pěkný skript, sloužící k provádění prezentací. Napsal ho Jeffrey Snover před jeho prezentací pro Billa Gatese a Raye Ozzieho. Skript byl od té doby vylepšen, poslední verze je z června 2007. Skript jsem viděl v akci již na několika konferencích u mnoha lidí a používám ho i pro své prezentace.

Výhodou je, že si předem připravíte všechny příkazy, které chcete obecenstvu ukázat a pak je pouštíte bez toho, abyste se museli bát, že uděláte překlep nebo něco nebude fungovat (i když generálský efekt funguje vždy a všude :) Vše funguje zhruba následovně:
  1. Připravíte si textový soubor, do kterého si na každý řádek napíšete jeden příkaz PowerShellu. Pokud spustíte Start-Demo bez parametru, použije obsah souboru demo.txt, pokud je v aktuálním adresáři. Máte-li jiné jméno souboru, zadejte ho jako parametr.
  2. Skript zobrazí první řádku a čeká na zmáčknutí klávesy Enter (případně na jinou "funkční" klávesu, viz dále). Máte tedy čas na vysvětlení příkazu.
  3. Příkaz je proveden, skript po jeho skončení čeká na další Enter a vy máte čas na popsání výpisu.
  4. Vše se poté opakuje až do konce obsahu vstupního souboru.
Skript za běhu vidíte na následujícím obrázku.

Na začátku každého řádku je vidět číslo příkazu, který je spouštěn. Dále vidíte v titulku okna dva údaje: délku běhu skriptu a aktuální příkaz. Již jsem se zmiňoval o "funkčních" klávesách. Můžete použít následující:
  • ? - zobrazí nápovědu, viz obrázek výše.
  • ! - vyskočí z prezentace do prostředí PowerShellu kde můžete provádět libovolný příkaz. Hodí se například v případě, že chcete reagovat na dotaz posluchačů. Zpátky se dostanete příkazem exit.
  • d - zobrazí obsah prezentovaného souboru včetně čísel řádek
  • #x - místo znaku # zadáte číslo příkazu, na který chcete skočit
  • fx - vypíše všechny řádky obsahující hledaný text, např. fGet
  • px - rychlost, kterou budou příkazy vypisovány na konzoli. Standardně je nastavena na 200ms.
  • b - vrací se o jeden příkaz zpět
  • s - přeskočí příkaz
  • t - kontrola času. Zobrazí čas trvání prezentace a pozici v prezentaci, např. pátá řádka z dvaceti.
  • q - ukončí prezentaci
Pokud chcete někomu ukázat možnosti PowerShellu, toto je skript, který mohu jen doporučit. Jeden tip na závěr: Nepoužívám defaultní jméno vstupního souboru (demo.txt), ale soubor s příponou ps1. Tím mám zaručeno, že při přípravě prezentace se mi soubor otevře v mém editoru a mohu využít jeho plné možnosti (např. zvýraznění syntaxe).

neděle 19. října 2008

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

Dnešním dnem bych rád odstartoval sérii zabývající se novinkami a zajímavostmi, které se udály za poslední týden (nebo které jsem v posledním týdnu objevil).

  • PowerScripting Podcast - Episode 45: Tentokrát s několika hosty (Jeffrey Snover, Don Jones, Alex Reidel, Kirk Munro) na různá témata.
  • V tomto blogu jsem uveřejnil krátký popis zpracování -OutVariable.
  • Nikoli PowerShell záležitost, ale dlouho jsme na ni čekali - nová verze Windows se bude jmenovat Windows 7.
  • Dmitry Sotnikov uveřejnil skript, který dokáže udělat snapshot AD účtů a porovnat rozdíly - více v jeho blogu.
  • Verb-Noun už jsem zde jednou zmiňoval. V microsoft.public.windows.powershell byl vznesen dotaz, který mne poté navedl na další zajímavé linky. Jedním z nich je řešení Oisina Grehana (které ale nefunguje úplně dobře - zmiňováno v news), dalším Microsoft Command line Standard. Seznam všech použitých Verb ve vašem PowerShellu můžete zjistit následovně:
    Get-Command -commandtype cmdlet |% {$_.name.toString().split("-")[0]} | Group-Object | Select Name
  • Doporučení pro tvorbu skriptů - 2. díl na stránkách Hugo Peeterse. Tomu samému tématu se věnoval v posledním čísle TechNet Magazínu také Don Jones.
  • I *heart* PowerShell, reakce na článek o Pythonu.

úterý 14. října 2008

commonParameter -OutVariable

V předchozích dnech jsem připravoval prezentaci pro své kolegy (až bude hotová, tak ji vystavím i zde) a rozhodl jsem se použít skvělý skript Jeffreyho Snovera - Start-Demo. Jelikož jsem si nestáhl poslední verzi, narazil jsem na zajímavý "problém", který mě trošku zdržel, ale zároveň pomohl jít v PowerShellu opět trochu víc do hloubky. Jedná se o použití parametru OutVariable, který je jedním z takzvaných commonParameters.

Vyzkoušejte si následující dva příkazy (kdo neví, co je commonParameter, ať zkusí i ten třetí :)
$a = Get-ChildItem
Get-ChildItem -OutVariable b
Get-Help about_commonparameters

V proměnných $a i $b je stejný obsah a obě fungují správně jako objekty. Problém ale nastane při následujícím výpisu:

PS C:\> $a.Length
PS C:\> 28
PS C:\> $b.Length
PS C:\>

Druhý zápis nám nevydá nic :( Přitom obě proměnné mají stejný výstup Get-Member a oba drží jako své členy System.IO.FileInfo. Rozdíl je vidět z následujícího:

PS C:\> $a.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

PS C:\> $b.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ArrayList System.Object


První je Object[] a druhý ArrayList. Pokud bychom chtěli proměnnou $b převést na stejný typ jako $a, můžeme udělat následující:

$c = $b.ToArray()

Jelikož je $b zpracován uprostřed příkazů, chová se trochu jinak, než pokud je zpracován na konci (jako $a). Příklad, který naznačené velice hezky ukazuje si můžete vyzkoušet.

$i=0; Write-Output "3. Three","5. Five ","2. Two ","1. One ","4. Four " `
-outvariable unordered | sort `
| % { Write-Host "$_ " -fore green -NoNewLine; Write-Host $unordered[$i++] -fore Cyan }

Je vidět, že i když objekty setřídíme, tak proměnná $unordered stále obsahuje původní (nesetříděný) obsah pole.

Chtěl bych poděkovat Jaykulovi, který se mi na IRC trpělivě věnoval a osvětlil mi toto podivné chování a je také autorem uvedených vysvětlujících příkladů.

pondělí 6. října 2008

Get-Command

Další cmdlet, který si ukážeme je Get-Command. Zpočátku jsem jej považoval za trochu jiný Get-Help, ale naštěstí jsem byl v relativně krátkém čase vyveden z omylu.

Použít jej můžete například pro zjišťování existujících cmdletů. Pokud víte, že chcete pracovat s objekty a neznáte všechny možnosti, použijte následující příkaz (výstup jsem trochu upravil pro potřeby zobrazení):

Get-Command *-object

CommandType Name Definition
----------- ---- ----------
Cmdlet Compare-Object Compare-Object...
Cmdlet ForEach-Object ForEach-Object...
Cmdlet Group-Object Group-Object [[...
Cmdlet Measure-Object Measure-Object...
Cmdlet New-Object New-Object [-Ty...
Cmdlet Select-Object Select-Object [...
Cmdlet Sort-Object Sort-Object [[-...
Cmdlet Tee-Object Tee-Object [-Fi...
Cmdlet Where-Object Where-Object [-...

Na výstupu dostanete všechny cmdlety, které slouží k práci s objekty a pokud se vám některý líbí, můžete na něj hned použít Get-Help.

Při práci s cmdlety je dobré vědět, jak vznikají jejich jména. Používá se forma nazvaná Verb-Noun (česky Sloveso-PodstatneJmeno). V první části názvu tedy říkáme co chceme dělat a ve druhé s čím chceme pracovat. I základní znalost angličtiny většinou stačí, aby člověk v krátké době začal používat tuto jmennou konvenci naprosto intuitivně. Pokud znáte verb-noun a víte, že PowerShell je objektový, můžete zkusit uhádnout výstup tohoto příkazu:

Get-Command -Noun Object

Nemělo by vás překvapit, že výstupem je stejný seznam jako v prvním případě. Existuje samozřejmě i přepínač -Verb. V nedávno uveřejněném článku, žádal Jeffrey Snover PS komunitu o dodržování pravidla verb-noun. Pokud budete vytvářet své cmdlety nebo skripty, snažte se v rámci "čitelnosti" toto pravidlo také dodržovat.

Get-Command slouží i ke zjištění informací o funkcích, aplikacích, skriptech, atd. Zajímá vás třeba ping, zadejte

Get-Command ping | Format-List

a dostanete výstup, ve kterém si můžete zjistit některé zajímavosti (verze, cesta, ...)

Na závěr si zkuste následující příkazy:

Get-Command
gcm
Get-Command *
Get-Command -Verb Get
Get-Command -CommandType Function