- 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.
neděle 26. října 2008
Get-PSNews |? {$_.CreationTime -lt "7days"}; Write-Host "Týden 43"
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ě:
- 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.
- 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.
- Příkaz je proveden, skript po jeho skončení čeká na další Enter a vy máte čas na popsání výpisu.
- Vše se poté opakuje až do konce obsahu vstupního souboru.
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
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:\>
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
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 }
-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.
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.
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 [-...
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
gcm
Get-Command *
Get-Command -Verb Get
Get-Command -CommandType Function
Přihlásit se k odběru:
Příspěvky (Atom)