středa 24. prosince 2008

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

Tentokrát malá změna v názvu :) Rozhodl jsem se dění před Vánocemi shrnout do jednoho článku. Příští novinky vyjdou až v novém roce. Přeji vám tedy všem pěkné svátky a v novém roce hodně povedených skriptů.
  • V pondělí již tradičně vyšel další díl PowerScripting Podcastu.
  • Richard Siddaway dokončil sedmou kapitolu knihy PowerShell in Practice. Dostupná je přes MEAP.
  • NetMap je nyní NodeXL.
  • Na DevCentral se objevila nová série PowerShell ABC's.
  • Thomas Lee píše o PowerShell.cz.
  • Video z Windows PowerShell Virtual User Group #7.
  • Tip na formátování PowerShell kódu v HTML. Rozhodl jsem se, že tento nástroj budu dále používat.
  • Chcete mít ve svém promptu zobrazeno procento nabití baterie? Použijte tento kód.
  • Super speciální Podcast - epizoda číslo 53. Hosté Jeffrey Snover a Bruce Payette.
  • Hlavní zpráva dne, měsíce, roku - nová verze PowerShellu je na světě. Tedy přesněji PowerShell V2 CTP3. Všechny následující zprávy se již točily okolo nové verze. Dnes jsem si s ní chvilku hrál a jelikož jsem nepoužíval CTP2 (kromě několika testovacích instalací) bylo pro mne nové úplně vše. Ale již z následujícího postu jsou vidět některé pěkné vlastnosti.
  • Zmiňovaný článek popisující Advanced Functions (jak by se nyní měly nazývat cmdlety).

Práce s cestou: *-Path

Pokud pracujete v PowerShellu s cestami mohou se vám hodit cmdlety z dnešního článku. Popsané techniky fungují jak pro práci se soubory/adresáři, tak i pro práci v registrech (s jistými omezeními).

Test-Path slouží k otestování existence cesty. Nejčastěji se používá pro test existence určitého souboru.

PS C:\> Test-Path C:\CONFIG.SYS
True
PS C:\> Test-Path $PROFILE
True
PS C:\> Test-Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
True
PS C:\> Test-Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion
False


V posledním případě je vidět, že práci s registry nám trochu komplikuje přístup PowerShellu k provideru registru. Funguje na úrovni klíčů a nikoli hodnot.

Convert-Path převede např. proměnné prostředí na reálnou cestu. Čili:

PS C:\> Convert-Path ~
C:\Documents and Settings\moravec
PS C:\> Convert-Path $env:TEMP
C:\WINDOWS\TEMP


Split-Path slouží k rozdělění cesty na její části, zjednodušeně řečeno na adresář a soubor. Bez uvedení parametrů vrátí rodičovský adresář.

PS C:\> Split-Path $env:temp
C:\WINDOWS

Pokud chcete naopak poslední část cesty, použijte parametr Leaf.

PS C:\> Split-Path $env:temp -Leaf
TEMP
PS C:\> Split-Path $PROFILE -Leaf
Microsoft.PowerShell_profile.ps1

Chcete-li získat root testované cesty použijte parametr Qualifier (případně NoQualifier, pokud chcete získat cestu bez rootu).

PS C:\> Split-Path $PROFILE -Qualifier
C:
PS C:\> Split-Path $PROFILE -NoQualifier
\Documents and Settings\moravec\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\> Split-Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Qualifier
HKLM:

Resolve-Path se používá v případě, že chceme získat cestu zapsanou zástupnými znaky. Porovnejte následující výstupy:

PS C:\> Resolve-Path ~
Path
----

C:\Documents and Settings\moravec
PS C:\> Convert-Path ~
C:\Documents and Settings\moravec

Na první pohled je vidět, že výstupem Resolve-Path bude asi něco zajímavějšího než jen čistý text. Je to tak - Convert-Path vrací řetězec, Resolve-Path naproti tomu vrací objekt typu System.Management.Automation.PathInfo. Tento objekt má několik vlastností.

PS C:\> Resolve-Path ~ | fl *

Drive : C
Provider : Microsoft.PowerShell.Core\FileSystem
ProviderPath : C:\Documents and Settings\moravec
Path : C:\Documents and Settings\moravec


Join-Path je posledním z "cestovních" příkazů. Používá se k tvorbě cesty. Chcete-li v adresáři, kde je uložen profil, vytvořit adresář pro vaše skripty, je jednou z cest následující příkaz:

PS C:\> mkdir (join-path (split-path $profile) \skripty\)

úterý 23. prosince 2008

PowerShell v2.0 CTP3 je na světě

A je to tady! CTP3 byla konečně vydána. První dáreček dnešních Vánoc dorazil.

Více přímo v článku na blogu PowerShell týmu.

pátek 19. prosince 2008

PowerScripting Podcast - Live CTP3 Special

Tak jsem se včera - vlastně to bylo dnes ve tři hodiny ráno - zůčastnil poprvé živého vysílání PowerScripting Podcastu. To byl mazec! Chápu, že mí mladší kolegové by to nazvali důchodcovským sedánkem, ale pro mne jako (cituji) PowerShell magora to byl odvaz.

Hosty byli tentokrát Jeffrey Snover a Bruce Payette, takže o zajímavé momenty bylo postaráno. Celou show mi ale zkazilo internetové připojení, které se rozhodlo, že mi bude vypadávat, takže jsem občas slyšel kus řeči a pak pět vteřin ticha. Paralelní chat byl plný skvělých postřehů, vtipů a dobré nálady. Je vidět, že komunita se dobře zná a dokáže si porozumět. Celou show sledovalo 46 lidí, což je prý dosavadní maximum. 

Všichni čekali na Jeffreyho slova o uvolnění CTP3. Bohužel bylo oznámeno, že vzhledem k (blíže nespecifikovaným) problémům se síťovým protokolem se uvedení na chvíli odkládá. I tak bychom se ale ještě v prosinci měli dočkat.

Když jsem se kolem páté se všemi - hodně unaven - loučil byl jsem rád, že jsem "byl u toho". Jenom kdybych nemusel o dvě hodiny později vstávat do práce, byl by dnešek o něco lehčí :)

čtvrtek 18. prosince 2008

CTP3 ???

Nedá mi to, abych se nepřidal k sérii blogů pokládajících si otázku, kdy bude oznámena verze CTP3. Že by v dnešním PowerScripting Podcastu? Některými lidmi je nazýván jako PowerScripting Live CTP3 Special. Doufám, že se dočkáme.

Já osobně zatím používám pouze verzi 1.0 a CTP2 mám nainstalovánu na počítači v labu. Před nějakou dobou jsem se ale rozhodl, že po uvedení CTP3 (nebo Beta?) přejdu na tuto novou verzi (na mém počítači, nikoli na serverech), protože možnosti, které má/bude mít jsou pro mne velkým přínosem. A hlavně se chci novou verzi naučit co nejdříve, abych při finálním uvedení neztrácel čas dalším učením.

Můj osobní tip je, že nová verze bude do konce roku uvedena - a něco mi říká (spíš si přeju), aby to bylo dnes v průběhu show. Doufám, že se tam potkáme.

neděle 14. prosince 2008

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

Opět s krátkým zpožděním (ale tentokrát pouze v řádu minut) se hlásím s další várkou novinek ze světa PowerShellu. Před chvilkou jsem konečně dopsal druhou část ze série o operátoru formátování a zjistil jsem, že to bude opravdu dlouhé dílo. Uvažuji o následném spojení všech dílů do jednoho PDF souboru (včetně nějaké formy přehledné tabulky) a vystavení všeho společně pro lehčí orientaci.
  • Máte rádi poker? Zkuste si dát tento kód do $profile a můžete hrát kdykoliv :)
  • Krásná práce spojení HTML, WMI a PowerShellu - Audit.ps1.
  • Pokud spravujete VMware infrastrukturu a chcete používat PowerShell, dejte si na waiting list tuto knihu.
  • 51. epizoda PowerScripting Podcast, hostem tentokrát Doug Finke.
  • Třetí díl zajímavé série o práci s HTML strukturou od Jamese Brundage.
  • Jaykul mne předběhl :)
  • Krásný post Jeffreyho Snovera o prozkoumávání [Environment].

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

V minulém díle jsme se podívali na základy operátoru formátování. Dnes se budeme plně věnovat jeho kouzlům při práci s časovými položkami. Vzhledem k tomu, že v průběhu psaní článku jsem zjistil, že pro jeden díl je informací hodně, rozdělil jsem zpracování data do dvou pokračování. Dnes se podíváme na standardní formátování a příště na uživatelské.

Aktuální čas si nejdříve uložíme do proměnné, takže se nám budou lépe porovnávat výsledky všech operací:

PS C:\> $d = Get-Date
PS C:\> $d

1. prosince 2008 23:34:19


PS C:\>

Při základním použití operátoru -f dostaneme následující výstup:

PS C:\> "{0}" -f $d
1.12.2008 23:34:19
PS C:\> $d.GetTypeCode()
DateTime

Zároveň jsme si ověřili, že v proměnné d je uložen datový typ DateTime, takže můžeme začít provádět kouzla. Jestli se chcete podívat na různé varianty výstupu formátovacího operátoru, zkuste tento příkaz:

PS C:\> (Get-Date).GetDateTimeFormats()

Z minulého dílu víme, že obecný formát použití operátoru –f obsahuje také formátovací řetězec.

{index[,zarovnani][:formatovaciRetezec]}

formatovaciRetezec může v případě standardního formátování data nabývat osmnácti hodnot. Tyto hodnoty jsou zjednodušeně řečeno pouze aliasy pro uživatelský formát (definovaný systémem podle nastavení regionu). Pojďme si nejdříve ukázat všechny možnosti a poté je popíšeme podrobněji při současné lehké exkurzi do .NETu.

PS C:\> "{0:d}" -f $d
1.12.2008
PS C:\> "{0:D}" -f $d
1. prosince 2008
PS C:\> "{0:t}" -f $d
23:34
PS C:\> "{0:T}" -f $d
23:34:19
PS C:\> "{0:f}" -f $d
1. prosince 2008 23:34
PS C:\> "{0:F}" -f $d
1. prosince 2008 23:34:19
PS C:\> "{0:g}" -f $d
1.12.2008 23:34
PS C:\> "{0:G}" -f $d
1.12.2008 23:34:19
PS C:\> "{0:u}" -f $d
2008-12-01 23:34:19Z
PS C:\> "{0:U}" -f $d
1. prosince 2008 22:34:19
PS C:\> "{0:r}" -f $d
Mon, 01 Dec 2008 23:34:19 GMT
PS C:\> "{0:R}" -f $d
Mon, 01 Dec 2008 23:34:19 GMT
PS C:\> "{0:m}" -f $d
01 prosince
PS C:\> "{0:M}" -f $d
01 prosince
PS C:\> "{0:y}" -f $d
prosinec 2008
PS C:\> "{0:Y}" -f $d
prosinec 2008
PS C:\> "{0:s}" -f $d
2008-12-01T23:34:19
PS C:\> "{0:o}" -f $d
2008-12-01T23:34:19.8358768+01:00

Jedna vlastnost je jasná na první pohled - PowerShell v případě operátoru -f rozlišuje velikost písmen! První a druhý příklad tedy nejsou rovnocenné. V prvním (0:d) zobrazujeme datum ve formátu ShortDate, ve druhém (0:D) je použit LongDate formát. Kde se tento formát bere – a jak je definován – si ukážeme později. Příklady jsou řazeny do dvojic a proto si každou projdeme společně:
  • d, D - jak již bylo zmíněno, výstupem bude datum v krátkém (1.12.2008) nebo dlouhém formátu (1. prosince 2008)
  • t, T - zobrazuje tentokrát čas, opět v krátkém (23:34) nebo dlouhém formátu (23:34:19)
  • g, G - takzvaný obecný formát, je kombinací předchozích dvou formátů. Platí g = d t; G = d T
  • f, F - datum a čas v úplném formátu, rozdíl je v zobracení času, čili matematicky: f = D t; F = D T
  • u, U - univerzální setříditelný formát. U = F
  • r, R - oba dávají stejný výsledek, datum v RFC1123 formátu
  • m, M - zobrazuje den a měsíc, obě možnosti dávají shodný výsledek
  • y, Y - formát pro zobrazení roku a měsíce, obě možnosti dávají shodný výsledek
  • s - tříditelný formát
  • o - round-trip formát (Microsoft neuvádí překlad anglického termínu, ale můžeme jej interně nazvat jako "ten nejpodrobnější" :)
  • Jakýkoli jiný znak je brán jako neznámý a způsobí vyhození výjimky.
Zatím jsme brali jako fakt, že existují jakési formáty a pomocí uvedených formátovacích řetězců voláme jejich aliasy. Pojďme si podrobně projít první příklad.

PS C:\> "{0:d}" -f $d
1.12.2008


Jak již bylo řečeno, toto zobrazení používá krátký formát data. Anglicky řečeno, používá ShortDatePattern property. ShortDatePattern je jednou z vlastností .NET třídy DateTimeFormatInfo a každý systém ji definuje podle nastavení regionu. Jak zjistit naše nastavení? V PowerShellu existuje cmdlet Get-Culture, který nám s naším pátráním pomůže (výstup byl výrazně zkrácen).

PS C:\> Get-Culture | Get-Member

TypeName: System.Globalization.CultureInfo

DateTimeFormat Property System.Globalization.DateTimeFormatInfo DateTimeFormat

Vidíte typ DateTimeFormatInfo? Jsme evidentně na správné stopě. Zkusme se ještě trochu zanořit (opět zkráceno).

PS C:\> (Get-Culture).DateTimeFormat

ShortDatePattern : d.M.yyyy

A jsme téměř u cíle. ShortDatePattern je aliasem pro formát d.M.yyyy. Hmm, zajímavé, ale kde zjistíme, co znamená například yyyy? yyyy je jedním z dříve zmíněných uživatelských formátovacích řetězců, o kterých se budeme bavit příště. Nyní nám stačí informace že d. zobrazuje den ve tvaru 1. - M. zobrazuje měsíc ve tvaru 12. a yyyy rok jako 2008. Jaký formát je přiřazen konkrétnímu formátovacímu řetězci je možné najít v MSDN, ve zkratce se jedná o následující:
  • d – ShortDatePattern
  • D – LongDatePattern
  • t – ShortTimePattern
  • T – LongTimePattern
  • F – FullDateTimePattern
  • u – UniversalSortableDateTimePattern
  • r, R - RFC1123Pattern
  • m, M – MonthDayPattern
  • y, Y – YearMonthPattern
  • s – SortableDateTimePattern
Pro nastavení systému cs-CZ jsou formáty následující:

FullDateTimePattern : d. MMMM yyyy H:mm:ss
LongDatePattern : d. MMMM yyyy
LongTimePattern : H:mm:ss
MonthDayPattern : dd MMMM
RFC1123Pattern : ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
ShortDatePattern : d.M.yyyy
ShortTimePattern : H:mm
SortableDateTimePattern : yyyy'-'MM'-'dd'T'HH':'mm':'ss
UniversalSortableDateTimePattern : yyyy'-'MM'-'dd HH':'mm':'ss'Z'
YearMonthPattern : MMMM yyyy

Příště si povíme o uživatelských formátech a ukážeme si, co si představit například pod formátovacím řetězcem MM. Soubor s ukázkami dnešního dílu si můžete opět stáhnout.

pondělí 8. prosince 2008

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

S mírným zpožděním - způsobeným mým totální pracovním a osobním nasazením v minulém týdnu - vychází další díl ze světa novinek PowerShellu. I poslední týden byl nabitý událostmi a já osobně jsem s jejich sledováním ve velkém skluzu. Doufám, že jste na tom lépe. V několika článcích z minulého týdne jsem si všiml komentářů na začátku skriptu (např. u níže zmíněného Lee Holmese). James Brundage píše, že se jedná o nápovědu vloženou do skriptu (script-embedded help) a bude se používat od CTP3.

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

čtvrtek 13. listopadu 2008

Školení PowerShell - den čtvrtý

V dopolední části jsme ještě zhruba do jedenácti hodin "dojížděli" modul o souborech. Praktická cvičení na konci byla opravdu ryze praktická a procvičila nás jak v příkazech cyklu a funkcích, tak i v cmdletech pro práci se soubory.

Modul 8, Možnosti .NET Frameworku - na ten jsem se hodně těšil. .NET občas používám ve svých skriptech, ale zatím je to metodou chaosu a pokusů. Ucelenější popis použitelných tříd "nikde" neexistuje (samozřejmě pokud pominu MSDN, kde je vše super popsáno a zatím jsem tam našel vše, co jsem potřeboval). Ukázali jsme si přímý přístup ke třídám a poté jsme se věnovali těm, které jsou pro administrátory užitečné. Nebudu je všechny vyjmenovávat, ale zmínili jsme se například o vzdálené správě služeb nebo připojení do databáze.

Práce s Active Directory byl název Modulu 9. Ukázali jsme si několik způsobů, jak přistupovat do Active Directory přes .NET, ADSI, Quest AD cmdlets a pomocí PSDrive z balíku PSCX. Jinými možnostmi přístupu jsme se nezabývali, což ovšem nebylo na škodu, protože i tak jsme toho měli na probrání, zkoušení a sledování opravdu hodně.

Dnešek byl plný hodně zajímavých věcí a různé upřesňující dotazy a odpovědi byly skvělým kořením.

středa 12. listopadu 2008

Školení PowerShell - den třetí

Tak po dnešku se přesuneme za polovinu kurzu, takže doufám, že začneme s odvážnějšími tématy. Ráno jsme dojeli soubory (CSV, XML), probrali cmdlety Out-* a začali jsme Modul 6 - Řízení běhu skriptu v PowerShellu. Už teď mohu zodpovědně prohlásit, že zas tak úplně podle knihy nejedeme. Slouží spíš jako referenční příručka, kde jsou vysvětleny příklady. Kurz jako takový - a hlavně okamžitou reakci na dotazy - nenahradí.

Začali jsme podmínkami a smyčkami (if, switch, while, foreach, ...) a ukázali si pár příkladů. Vyzkoušeli jsme si umístění větve default v příkazu switch a dostali jsme se do pěkných filosofických debat. Závěrečný příklad na foreach byl moc hezký (vypsat barevně procesy podle alokované paměti) - já ho řešil jako one-liner. Což se mi nevyplatilo hned při dalším cvičení, kdy jsme měli "skript" z předchozí úlohy přepsat jako funkci a předat jí parametr. Takže jsem stejně musel jít do IDE a pracovat v něm. Funkce jsme probrali včetně bloků BEGIN, PROCESS, END a ukázali jsme si tím pádem i práci funkce v rouře. Po funkcích následoval - zcela podle předpokladů - čas věnovaný filtrům.

Modul 7 - Souborový systém a dle názvu jasně určené téma. Zabývali jsme se výpisy (Get-ChildItem), přejmenováním (Rename-Item), kopírováním (Copy-Item), přesouváním (Move-Item) a mazáním (Remove-Item). Závěrečný příklad prověřil skvěle naše znalosti. Mé řešení bylo následující:

$i=1;$d=(get-date -u "%Y-%m-%d"); ls |? {!($_.PSIsContainer)} | sort LastWriteTime |% {rni $_ -n "$d-$i";$i++}

Nerozumíte mu? Přijďte na kurz - pan Malina vás rád uvidí :)

úterý 11. listopadu 2008

Školení PowerShell - den druhý

Ráno jsme začali trošku zlehka krátkou ukázkou některých použitelných PowerShell editorů. Po této "rozcvičce" začala pravá zábava - objekty a Modul 3 - Objektové myšlení a objektově orientované programování.

Vše je objekt - heslo na další hodinu. Vysvětlení začalo standardním popisem "objektu auto" a předvedením jeho vlastností a metod. Toto bylo dále rozvedeno na několika příkladech z reálného (např. dům) i virtuálního (Win32_Share) života. Plynule jsme navázali na cmdlet Get-Member - dle lektorova (i mého) názoru asi nejužitečnějšího z celé škály (trochu odbočka: jeho popis mám už rozpracován a doufám, že se mi podří jej dokončit v několika málo dnech). Trochu jsme naťukli i technologii COM a poté se zanořili zpět do objektů a podívali se na PSbase a jeho bratříčky.

Modul 4 - Roura (pipeline) v PowerShellu neboli začínáme dělat divy :) Na začátek byla popsána výhoda roury a poté rozdíl mezi textovou (*NIX) a objektovou (PS) rourou. Samozřejmě byly ukázány krátké příklady. Celý modul jsme zakončili přehledem příkazů pracujících s objekty v rouře (ForEach-Object, Where-Object, ...).

V Modulu 5 - Tok a ukládání dat v PowerShellu - jsme začali s proměnnými a jejich přiřazováním, přetypováním a různými divokými operacemi. Probrali jsme operátory (+=, -=, ...) a přešli jsme na práci s poli. Přiřazovali jsme různé hodnoty a probírali se indexováním všemi směry. Lehce jsme se dotkli asociativních polí (hešů) a jejich požití při formátování výstupů (např. v příkazu Get-EventLog). Posledním tématem tohoto dne byla práce s textovými soubory. A to jak klasické TXT soubory, tak i využití CSV pro uchovávání objektů a jejich opětovné vyvolávání.

pondělí 10. listopadu 2008

Školení PowerShell - den první

Tak jsem se po dlouhé době dočkal a mohl vyrazit do počítačové školy Gopas na týdenní školení PowerShellu. Kurz vede Patrik Malina velký propagátor non-GUI řešení na platformě Windows. Už jsem u něj absolvoval v Gopasu dvě školení: MOC2433 (základy skriptování ve WSH) a MOC2439 (skriptování pomocí WMI) a zůčastnil jsem se několika jeho přednášek. Jeho styl výkladu je mi velmi blízký a příjemný.

Jak jsem předpokládal, osnova kurzu se bude řídit podle knihy PowerShell - podrobný průvodce skriptováním, jejíž je pan Malina autorem. Všichni účastníci kurzu ji na začátku dostali jako studijní materiál (což mi udělalo radost, protože tu svojí koupenou můžu dál používat jako pracovní a novou mohu dát hezky do knihovny mezi ostatní PowerShell knihy).

Ráno jsme začali lehkým představením prostředí školy a obsahu kurzu. Poté již přišel na řadu Modul 1, který byl nazván Windows scripting concepts and technologies a zabýval se historií ovládání Windows z příkazové řádky a skriptu (cmd.exe, WSH, WMI, PowerShell). Již první příklad postavil před některé z nás zapeklitou úlohu :)

Modul 2 s názvem Zprovoznění PowerShellu a základy práce v prostředí nás již vrhl do víru toho "správného Shellu". Instalace (které předcházel kratičký nástin .NET) a vysvětlení Set-ExecutionPolicy nás před obědem pěkně připravily na odpolední část. Tu jsme začali popisem základního chování konzole: doplňování pomocí klávesy TAB, Verb-Noun, neinteraktivní běh a povídání o historii a přepisu příkazů. Probrali jsme interaktivní režim a podrobněji se podívali i na chování a možnosti přepínačů. Ihned poté jsme se vrhli na $PROFILE a úpravu promptu, což rozpoutalo první složitější dotaz, který byl vzápětí prompt-ně zodpovězen. Ke konci dne jsme se bavili o aliasech a skončili jsme filozofií PSDrives, kde jsme dělali další ze zajímavých příkladů.

neděle 9. listopadu 2008

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

Musím říct, že tento týden byl na novinky opravdu bohatý. Nejen, že se ozvývají dozvuky PDC, ale hlavně se v Barceloně konal další TechEd.
  • Windows PowerShell na TechNet Library.
  • V jednom velmi starém příspěvku (v době, kdy bude tento post publikován to bude přesně rok :) jsem našel příklady použití operátoru -f.
  • Krásný one-liner z Jaykulova Twitteru - reakce na americké volby: Get-Conversations| Where{ $_.Topic -eq Politics} | Start-Sleep
    a malý doplněk: They're all lucky, I *was* going to pipe that to | kill -force
  • Sapien uvolnil volně ke stažení PrimalForms spolu s krátkým Getting Started.
  • Další epizoda PowerScripting Podcastu, tentokrát s pořadovým číslem 47.
  • PowerShell for Visio - mazaný nástroj pro generování PS skriptů přes Visio.
  • Tak máme za sebou konečně volbu nového amerického prezidenta. Jak to souvisí s PowerShellem? Konečně se budou na IRC, Twitteru a dalších řešit jiné věci než politika a můžem smazat z $PROFILE tento řádek: Get-Tweet | ? { $_.Message -notmatch "election|president|vote|obama|mccain|palin" } - autor opět Jaykul.
  • PrimalScript 2007 Classroom Edition bude využíván při kurzech Windows Administration and Automation Using PowerShell. Dohodly se na tom firmy Microsoft a SAPIEN.
  • V novém čísle TechNet magazínu tentokrát dva články o PowerShellu: pokračování Building a Better Inventory Tool a v sekci Hey, Scripting guy! Calculating Server Uptime.
  • Známá jména z PowerShell komunity na fotce z TechEdu.
  • Jestli chcete, můžete vyplnit krátký dotazník na PowerShellCommunity.org.
  • Jak na vzdálený EventLog pomocí .NET.
  • Celý příští týden budu na školení PowerShellu v počítačové škole Gopas. Přednášejícím bude Patrik Malina, autor knihy PowerShell - Podrobný průvodce skriptováním (podle které se dle mého názoru "pojede"). Gopas nabízí ještě oficiální MOC kurz, ale já jsem se rozhodl pro tento čistě z důvodů trvání kurzu (pět dní vs. tři MOC).

čtvrtek 6. listopadu 2008

Get-PSNews |? {$_.category -eq "Hot Topic"}

Tato zpráva se svou důležitostí řádí mimo standardní novinky, publikuji ji tedy okamžitě.

Jeffrey Snover oznámil na konferenci Tech-Ed datum zveřejnění Powershellu v2:
  • Prosinec 2008 - CTP3 (nebo Beta 1, pokud bude splňovat všechny náležitosti)
  • RTM - konec 2009/začátek 2010 jako součást Windows 7 a WS08R2
  • RTM pro XP, 2003, Vista a WS08 - jako download o pár měsíců později
Převzato z Dmitry's PowerBlogu.

P.S.: Stejně jak píše Dmitry jsem očekával uvedení o pár měsíců dříve :(

úterý 4. listopadu 2008

PrimalForms - první formulář (first form)

[EN]: This text describes my first form created with PrimalForms tool from Sapien. It is available at Sapien web for free!
As I work as an SMS administrator one of my most often tasks is to run packages for testing on my VM machines. I have PowerShell open whole day and now I can use Set-Alias for calling my version of Run Advertised Programs snapin.
How it works: OnLoad of the form it checks all available programs from UIResource.UIResourceMgr. Then it lists all found in Listbox. When you choose one of the available programs and click to Run, it will run ExecuteProgram method and start the installation.
Note: I didn't test the form in production yet. I also didn't test it for any error states - now it's published just for fun. You are running the code on your own risk!
Available here.


[CZ]: Včera večer uvolnila firma Sapien zdarma nástroj PrimalForms (čímž mi "umožnila" jít spát v jednu ráno :). Začal jsem jej mírně oťukávat a dnes jsem si během několika málo minut (nejvíc času zabral design formuláře) vytvořil svou verzi snapinu Run Advertised programs. Jelikož pracuji jako SMS administrátor používám tento snapin několikrát za den při testování našich balíčků.

Jak vše funguje: Při otevření formuláře načte všechny dostupné programy z UIResource.UIResourceMgr a vloží je do listboxu. Poté, co vyberete jeden z dostupných programů a kliknete na Run, zavolá se metoda ExecuteProgram a program je spuštěn.
Upozornění: Skript jsem zatím testoval pouze ve VM prostředí a nejsou v něm ošetřeny žádné nepředvídatelné okolnosti (ani ty předvídatelné). Zatím je to opravdu jen ukázka práce. Skript spouštíte na vaši vlastní zodpovědnost.
Skript si můžete stáhnout zde.

neděle 2. listopadu 2008

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

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


pondělí 29. září 2008

PowerScripting Podcast review

[Update 5.10. 17:15]
Právě mi přišel mail od Hala Rottenberga. Stal jsem se jedním z vítězů :) Již jsem si vybral knihu - Windows PowerShell™ v1.0: TFM® 2nd Edition. Přemýšlel jsem také o Managing Active Directory with Windows PowerShell: TFM®, ale tu si koupím časem do práce.

[Česky]
V jednom z předchozích PowerScripting podcastů byla uveřejněna "soutěž" o dvě knihy od SAPIEN Press. Podmínkou je napsání recenze na podcasty. Máte šanci do 2.října. Podrobněji na http://powerscripting.wordpress.com/

[English - PowerScripting Podcast Review]
I started to listen PowerScripting Podcasts few weeks ago. I found it during my "Hunt for PS sources". So immediately I created the script and download all previous PS podcasts to my computer - now it's more than 36 hours of PS talking.

This podcast has some advantages for PowerShellers:
  • Overview of latest cool PowerShell scripts, some of them you can't miss - here you have it at one place.
  • Jonathan & Hal are well known IT guys and they knows the things they are talking about - small plus for podcasts.
  • It's not just talking about PowerShell - it's talking about PS and all the world around, including VM, AD and other technologies.
  • What I really like is an interview with interesting people. I can learn a lot from them - guys like Jeffrey Snover, Jeff Hicks, Greg Shields and others can teach me a lot. At least to hear their thinking is very useful.
  • The good thing is also when I hear that those big guys are doing things the same way as me (better - I am doing it like they) - Then I know that the way of scripting is not an impasse.
  • Last but not least - for me is very good to listen English and I now am using "cool" more in my daily life :) Of course it's because PowerShell IS cool.
As an conclusion: Listen-Podcast(PowerScripting Podcast)


čtvrtek 25. září 2008

PowerShellPlus Professional Edition konečně dostupný

Editor, o kterém jsem zde již psal, je nyní dostupný v ostré verzi. Cena je $145, ale do konce září můžete využít zaváděcí cenu $79. Nabídka je to velice lákavá a jelikož v současné době testuji i další dva známé PowerShell editory (Admin Script Editor, Primal Script) mohu zatím prohlásit, že PSPlus se mi líbí nejvíce. Samozřejmě je to pouze věc osobního názoru.

PowerShellPlus Professional Edition včetně krátké "screenshot tour" najdete na stránkách Idera.

TAOCP v češtině

Trošku mimo PowerShell, ale nedá mi to zde nezmínit. V češtině vychází legendární (nebál bych se toho slova) kniha The Art of Computer Programming (do češtiny přeložena jako Umění programování). Přesněji řečeno, vychází první díl nazvaný Základní algoritmy (v originále Fundamental Algorithms). Knihu vydává CPress a její cena na stránkách vydavatelství je 990 Kč.

Donald E. Knuth je známý mimojiné i skvělými programy TeX a METAFONT.

Odkazy na Wikipedii:

neděle 21. září 2008

PowerShell prezentace v Second Life

Před chvílí publikoval Marco Shaw v diskusní skupině microsoft.public.windows.powershell odkaz na blog Blaina Bartona.

V Second Life bude probíhat třídílná série přednášek o Powershellu. Každý z dílů série je plánován na přibližně 90 minut. První (PowerShell Basic's) se bude konat 27. září.

Více se můžete dozvědět v Blainově blogu.

pátek 19. září 2008

PowerShellPlus Professional Edition zdarma

Pokud sháníte editor pro PowerShell, možná se vám bude líbit nabídka firmy Idera. Pro posluchače PowerScripting Podcast-ů je připravena možnost získat PowerShellPlus Professional Edition zdarma. Nechci sem dávat přímý link, ale pokud půjdete na stránky PowerScripting Podcast, tak v epizodách 40 a 41 najdete popis, jak se k editoru zdarma dostat. Podle popisu to vypadá, že dostupných bude pouze několik licencí, tak neváhejte a spěchejte.

čtvrtek 18. září 2008

Recenze: PowerShell - Podrobný průvodce skriptováním

Prozatím jediná kniha o PowerShellu v češtině pochází z pera jednoho z největších propagátorů administrace Windows přes příkazovou řádku - Patrika Maliny. Patrik Malina je lektorem v počítačové škole Gopas, kde má na starost mimojiné kurzy skriptování (VBS, WMI) a PowerShellu.

Kniha je rozdělena do šesti kapitol a je doslova nacpaná informacemi. Zabývá se jak teoretickými informacemi (historie), základní prvky jazyka (cmdlets, konstrukce, ...), tak i praktickými administrátorskými úlohami.

Kapitola 1, Přehled možností skriptování ve Windows popisuje vývoj příkazového řádku ve Windows od MS-DOSu až do současnosti a ukazuje i možnosti skriptování na této platformě (např. WSH). Informuje čtenáře o rozhraní ADSI a rozhraní pro WMI. Na konci kapitoly je uvedena krátce historie PowerShellu a zmíněny dva další často používané nástroje: příkaz wmic a LogParser - oběma se autor věnuje podrobně dále v knize.

Kapitola 2, Základy prostředí PowerShell tvoří spolu s kapitolou tři nosnou část knihy. V této jsou popisovány příkazy, bez kterých se při další práci v PowerShellu prostě neobejdete. Autor začíná nastavením prostředí, spuštěním prvních příkazů a hned přechází k tématu cmdlets, čili příkazů PowerShellu. Jedním z hodně užitečných - a často opomíjených - je i Get-Help. Po tomto rozjezdu následuje kapitola o rouře, která je jedním ze základních použitých principů. Autor se zmiňuje i o příkazu ForEach-Object, který základem pro zpracování dat tekoucích rourou. Dále je v kapitole zmíněn vstup a výstup dat, jak v prostředí příkazové řádky, tak například při práci se soubory (např. CSV, XML). V poslední části je zmíněna práce s objekty, což je pro PowerShell jedna ze základních vlastností.

Kapitola 3, Jazyk PowerShell se začíná blížit skriptování ve VBS. Na začátku jsou vysvětleny konstrukce - podmínky, větvení (if, while, for, ...) a vytváření funkcí. K zajímavým částem patří možnosti ladění a tzv. error handling. Po této "programátorské" části se již dostává na řadu práce se souborovým systémem a registry. Autor se poté vrací opět k "programování", další kapitola se věnuje využití .NET v PowerShellu, což je téma, se kterým se v praxi setkáte určitě velmi často. Následuje popis práce s Active Directory a s WMI. Krátce je také zmíněn mechanismus regulárních výrazů. Kapitola je ukončena popisem možností práce s COM. Pokud perfektně zvládnete témata této kapitoly, jste na dobré cestě.

Kapitola 4, PowerShell v akci ukazuje praktické administrátorské postupy a jejich řešení v PowerShellu. Jedná se hlavně o práci s logy, službami, procesy a Active Directory. Okrajově je zmíněna například administrace MS Exchange 2007.

Kapitola 5, Jiné možnosti administrace skripty popisuje dva nástroje zmiňované v úvodu knihy: příkaz wmic a LogParser (který je popsán opravdu velice dobře).

Kapitola 6, Referenční příručka PowerShellu je již pouze jakýmsi "shrnutím" celé knihy a popisuje pohromadě některé cmdlets.

Hodnocení

Vzhledem k velikosti trhu je jistě záslužným činem, že se někdo do takovéto práce pustil. Nutno ovšem říct, že pan Malina má přehled a určitě ví jaký je u nás o PowerShell zájem (byl mimojiné přednášejím na Gopas TechEd nebo setkání WUG). Kladně hodnotím množství informací v knize obsažených - pozorný čtenář si odnese opravdu velké množství informací. Co mě na knize naopak zklamalo je rejstřík - v porovnání s anglickými knihami, které mám ve své knihovně, je žalostný. Proto mám v knize množství záložek a na vnitřích deskách plno svých poznámek a odkazů dovnitř knihy.

Pro první seznámení s PowerShellem mohu knihu jen doporučit. Pokud se budete ovšem chtít dostat hlouběji, bez anglické literatury se stejně neobejdete. Knize bych dal známku dva.

pondělí 15. září 2008

Get-Help

Naši pouť po cmdletech začneme u jednoho z nejpoužívanějších (doufejme :) - Get-Help. Každý z nás byl někdy více či méně nespokojen z jakoukoli Microsoftí nápovědou (když pomineme lidi, kteří nápovědu nečtou, což je asi většina). V PowerShellu je ovšem Get-Help na velice dobré úrovni a doporučujeme jej používat. Základní variantou je čistě uvedení cmdletu bez parametrů:

Get-Help

Tento příkaz vypíše základní informace, ze kterých můžeme dále vycházet. Zobrazíme je všechny a ukážeme si na nich práci s nápovědou v PowerShellu (barevně jsme odlišili jednotlivé sekce - o nich si více povíme za chvíli).

TOPIC
    Get-Help

SHORT DESCRIPTION
    Displays help about PowerShell cmdlets and concepts.

LONG DESCRIPTION

SYNTAX
    get-help {<CmdletName> | <TopicName>}
    help {<CmdletName> | <TopicName>}
    <CmdletName> -?

    "Get-help" and "-?" display help on one page.
    "Help" displays help on multiple pages.

    Examples:
      get-help get-process : Displays help about the get-process cmdlet.
      get-help about-signing : Displays help about the signing concept.
      help where-object : Displays help about the where-object cmdlet.
      help about_foreach : Displays help about foreach loops in PowerShell.
      match-string -? : Displays help about the match-string cmdlet.

    You can use wildcard characters in the help commands (not with -?).
    If multiple help topics match, PowerShell displays a list of matching
    topics. If only one help topic matches, PowerShell displays the topic.

    Examples:
      get-help * : Displays all help topics.
      get-help get-* : Displays topics that begin with get-.
      help *object* : Displays topics with "object" in the name.
      get-help about* : Displays all conceptual topics.

    For information about wildcards, type:
      get-help about_wildcard

REMARKS
    To learn about PowerShell, read the following help topics:
      get-command : Displays a list of cmdlets.
      about_object : Explains the use of objects in PowerShell.
      get-member : Displays the properties of an object.

    Conceptual help files are named "about_<topic>", such as:
      about_regular_expression.

    The help commands also display the aliases on the system.
    For information about aliases, type:

      get-help about_alias

Každý help v PowerShellu je rozdělen do sekcí, které jsou volány v závislosti na parametrech cmdletu Get-Help (-detailed, -full). Názvy sekcí jsou následující:

  • Name - jméno cmdletu
  • Synopsis - krátký popis cmdletu
  • Syntax - popis syntaxe
  • Detailed Description - podbobnější popis funkce cmdletu
  • Parameters - popis použítí všech parametrů
  • Input Type - typ objektů, které cmdlet očekává na vstupu
  • Return Type - typ výstupu
  • Examples - příklady použití cmdletu
  • Related Links - jména podobných cmdletů
  • Remarks - informace o použití parametrů

Při volání Get-Help -full nám Get-Help vrátí všechny výše popsané sekce. Pro vypsání všech informací o cmdletu Get-WmiObject, tedy zapíšeme


Get-Help Get-WmiObject -full

Další zajímavou části nápovědy v PowerShellu je tématická nápověda. Poznáte ji podle toho, že její jméno začíná slovem about. Například Get-Help about_regular_expression vyvolá nápovědu o používání regulárních výrazů.

Domácí úkol: Projděte si všechny příklady v Get-Help a zapamatujte si je pro další použití :)