úterý 27. dubna 2010

Get-PSNews |? {$_.Week –eq ‘16’}

Minulý týden se na události vyvedl, takže pojďme rovnou na věc.

Aktuální týden bude hodně zajímavý. Nezapomeňte, že už běží 2010 Scripting Games.

neděle 18. dubna 2010

Get-PSNews |? {$_.Week –eq ‘15’}

Minulý týden byl na události o něco bohatší.

Poslední novinkou uplynulého týdne je to, že mi byla schválena účast na TechEd-u. Pokud si někdo třeba chce pokecat o PowerShellu u oběda nebo u pivka, můžeme udělat nějaký mini event :)

středa 14. dubna 2010

PowerShell kniha v češtině

Patrik Malina svém blogu oznámil, že druhé vydání jeho knihy o PowerShellu je připravena k tisku. Svým rozsahem (Celkový rozsah obou svazků bude přes 800 stran) a hlavně výkladem si myslím, že půjde o primární zdroj pro všechny české PowerShell nadšence.

Nemůžu se dočkat :)

úterý 13. dubna 2010

Get-PSNews |? {$_.Week –eq ‘14’}

Tak jestli jsem si myslel, že předminulý týden nebyl na události bohatý, ten poslední se také moc nevyvedl. Možná to bylo způsobeno tím, že jsem začal připravovat přesun tohoto blogu na vlastní doménu. Současný stav je takový, že jsem všechny příspěvky přesunul na platformu WordPress, vybral jsem téma (Mystique) a nyní upravuji design a připravuji novou strukturu. Po přesunu bych chtěl zároveň přejít kompletně na angličtinu (zřejmě mimo Mistra Šelíka). Pokud byste někdo chtěl poslat link na novou verzi (a pomoci mi jako testovací uživatel), dejte mi vědět přes Twitter (@makovec) nebo mailem (powershell(tečka)cz(zavináč)googlemail(dot)com).

Nyní ale tedy k těm několika málo novinkám.
To je protentokrát opravdu vše.

pátek 9. dubna 2010

Hej, mistře Šelíku!

Mist Šelík dohání to, co v minulých měsících zameškal a má před sebou nový Skriptíkův problém.

image

Máme několik možností.

Použít WScript.Network

PS C:\> (New-Object -Com WScript.Network).RemovePrinterConnection('\\server\Printer007')

Rychlé a účinné. Vytvoříme si nový objekt a okamžitě voláme jeho metodu RemovePrinterConnection. Potřebujeme vědět jenom jméno tiskárny. Předchzí řádku můžeme také rozepsat do (pro někoho možná srozumitelnější) formy jako:

PS C:\> $printerName = '\\server\Printer007'
PS C:\> $obj = New-Object -ComObject WScript.Network
PS C:\> $obj.RemovePrinterConnection($printerName)

Použití akcelerátoru [wmi]

Poněkud složitější konstrukce:

PS C:\> [wmi](gwmi Win32_Printer -Filter 'Name LIKE "%Printer007%"').Delete()

kterou můžeme opět rozepsat jako:

PS C:\> $prn = Get-WmiObject Win32_Printer -Filter 'Name LIKE "%Printer007%"'
PS C:\> [wmi]$prn.Delete()

V tomto případě si nejdříve do proměnné uložíme hledanou tiskárnu. Používáme parametr Filter, protože dotaz je rychlejší než při použití cmdletu Where-Object (Get-WmiObject Win32_Printer |Where-Object {$_.Name -like '*Printer007*'}). Pozor na jednu věc: ve filtru musíme použít znak ‘%’ jelikož se jedná vlastně o WQL dotaz prováděný na úrovni WMI.

Ve druhém řádku již voláme metodu Delete() a pomocí [wmi] vlastně provádíme “přetypování” na objekt System.Management.ManagementObject, který metodu Delete() obsahuje.

Ačkoli VBS moc rád nemám, v tomto případě bych asi osobně zvolil první možnost, která mi přijde jednodušší a pochopitelnější.

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

středa 7. dubna 2010

Hej, mistře Šelíku!

Po delší odmlce se opět vrátil mistr Šelík, aby pomohl Skriptíkovi s následujícím problémem.

image

Jelikož si Šelík už samozřejmě nainstaloval PowerShell v2, stačí tento jednoduchý příkaz:

PS C:\> Invoke-Command –ComputerName remoteComp –ScriptBlock {mkdir c:\Temp\NewFolder}

Tradáá. Pro fungování předchozího příkazu potřebujete dvě věci: Nastavený remoting a správná práva pro přístup ke vzdálenému počítači. Chcete-li se o vzdáleném přístupu dozvědět více, zkuste se podívat na jednu z následujících příruček:

  1. Administrator's Guide to Windows PowerShell Remoting (nutná registrace)
  2. Layman’s guide to PowerShell 2.0 remoting

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

úterý 6. dubna 2010

Get-PSNews |? {$_.Week –eq ‘13’}

Oproti předchozím týdnům byl ten uplynulý vcelku klidný (možná díky všeobecné velikonoční náladě). Přesto se našla jedna hlavní zprváva, kterou uvádím hned jako první).

Pro dnešek to bude opravdu vše. Snad se příště urodí více novinek.

neděle 28. března 2010

Get-PSNews |? {$_.Week –eq ‘12’}

V příjemném nedělním večeru jsem zde opět s pravidelnou dávkou novinek ze světa PowerShellu. Uplynulý týden byl pro mne hodně zajímavý. Mimoto, že jsem dokončil tvorbu prvních cmdletů, vrhl jsem se na pokus s vytvořením provideru pro můj oblíbený Systems Management Server. Zároveň jsem se podíval na podrobnou revizi některých částí dokumentace PowerShellu. K tomu probíhá review knihy PowerShell Cookbook a dnes ráno uvolnil Manning Press poslední část knihy PowerShell in Practice. Musím říct, že jsem se nenudil a nudit se asi ani nebudu. Zároveň jsem začal postupně zpracovávat své poznámky, ve kterých jsem si poznamenal tipy na články. Doufám, že se mi vše povede postupně převést do písmenek :) Dost bylo mého výlevu, pojďme na novinky.

To by bylo pro tento týden vše.

sobota 27. března 2010

Modul FileSystem

Součástí PowerShellPack-u je několik modulů. Jedním z nich je i FileSystem.
Poznámka: Pokud jste ještě PowerShellPack nezkoušeli, můžete si jej bezplatně stáhnout. Je také součástí Windows 7 Resource Kitu. Obsahuje několik zajímavých modulů. Několika z nich se budu v dohledné době na těchto stránkách věnovat.
Pro práci s modulem jej musíme nejdříve importovat.

PS C:\Scripts> Import-Module FileSystem
PS C:\Scripts> Get-Module

ModuleType Name
---------- ----
Script FileSystem


Příkazy modulem exportované pro použití zjistíme pomocí Get-Command.

PS C:\Scripts> gcm -Module FileSystem | ft Name

Name
----
Copy-ToZip
Get-DuplicateFile
Get-FreeDiskSpace
Get-SHA1
Mount-SpecialFolder
New-Zip
Rename-Drive
Resolve-ShortcutFile
Start-FileSystemWatcher


Pojďme si všechny dostupné příkazy (funkce) projít.

New-Zip, Copy-ToZip
New-Zip vytvoří prázdný archiv, do kterého potom můžete přidávat soubory pomocí Copy-ToZip. Vzhledem k tomu, že Copy-ToZip vytvoří archiv, pokud neexistuje, přijde mi New-Zip trochu nepotřebný. Copy-Zip jsem využil opravdu jenom na základní věci. Při komprimování většího množství dat se výsledný archiv choval poněkud zvláštně (špatné cesty, zdvojené soubory, ...).
Rename-Drive
Jednoduchá funkce, která zapouzdřuje volání třídy Win32_LogicalDisk z WMI. Myslím, že nepřináší nic nového.

Get-FreeDiskSpace
Zobrazuje volné místo na disku v procentech a absolutně. Bohužel je výstup na první pohled poněkud zvláštní a tak bych doporučil ho mírně formátovat, například takto:

(Get-FreeDiskSpace).countersamples |? {$_.instancename -eq 'c:'} | ft -a

Path InstanceName CookedValue
---- ------------ -----------
\\PC\logicaldisk(c:)\% free space c: 23,7249711709823
\\PC\logicaldisk(c:)\free megabytes c: 36210


Resolve-ShortcutFile
Se hodí v případě, že máte soubor s příponou url a potřebujete zjistit, kam tento soubor odkazuje.

Get-SHA1
Dle názvu správně hádáte, že výstupem této funkce je hash zadaného souboru. Tuto funkci využívá ta následující.

Get-DuplicateFile
Pokud máte pocit, že některé soubory máte na disku vícekrát, můžete je pomocí této funkce zjistit.


PS C:\tmp> Get-DuplicateFile | fl Name, Value
Name : TlRNG4ETIySjh3rHonlURNSqPtU=
Value : {C:\tmp\2.JPG, C:\ts\tmp\Copy of 2.JPG}

Name : veSzujcoGoW+LpjcFAily548z9o=
Value : {C:\tmp\9.JPG, C:\tmp\Copy of 9.JPG}

Name : Ddx0Vo+oW0m2oRLB3WmnTmZsP78=
Value : {C:\tmp\0.JPG, C:\tmp\Copy of 0.JPG}



Mount-SpecialFolder
Přidá Special Folders jako další drives (dostupné pomocí Get-PsDrive). Mimochodem, tato funkce je spouštěna při importu modulu.

Start-FileSystemWatcher
Kontoroluje souborový systém a při změně spustí zadanou akci. Můžete tedy například sledovat nové soubory v určitém adresáři.

PS C:\Scripts> Start-FileSystemWatcher -File .\Secret -On Created `
-Do { $((ls c:\Scripts\Secret | Sort CreationTime -Descending | Select -First 1).FullName) >> c:\zapsano.txt}


Při vytvoření jakéhokoli souboru se plný název tohoto souboru zapíše do zapsano.txt. Bohužel má tato funkce jednu obrovskou nevýhodu. Neexistuje k ní Stop-FileSystemWatcher. Takže je na vás použít standardní cmdlety, abyste sledování zastavili.

neděle 21. března 2010

Get-PSNews |? {$_.Week –eq ‘11’}

Jak jsem minule skončil, tak dnes začnu. Povíme si také o nových PowerShell prezentacích.
  • Minule jsem odkazoval na druhé vydání knihy Lee Holmese, PowerShell Cookbook. Mluvil jsem o tom, že začíná její review. Já jsem se přihlásil jako jeden z reviewerů (hezké slovo :). Tento týden uveřejnil Lee na svých stránkách oficiální odkaz, takže pokud chcete, můžete se také přidat a ovlivnit svými poznámkami nové vydání.
  • Firma Digi Trade pořádá 16.4. krátkou přednášku s tématem PowerShellu, více na jejich stránkách bezplatných seminářů.
  • Další ročník konference TechEd se tentokrát bude konat od 26. do 29. dubna. Program je již dostupný na stránkách konference. Pro mne jsou zajímavé dvě přednášky Patrika Maliny na téma PowerShell v2.
  • Scripting Games se blíží. Včera a dnes vyšly na Scripting Guy blogu dva příspěvky na téma Your Mission a Study Guide.
  • Thomas Lee začal na základě jeho PowerShell Master Class kurzu zpracovávat dostupné zdroje. Můžete se na ně podívat na stránkách PSMC Resources.
  • Pokud vás zajímá, jak generovat SQL skript pomocí PowerShellu, podívejte se na tento příspěvek.
  • Zajímavé porovnání rychlosti zápisu pomocí Add-Content, Out-File a IO.StreamWritter.
  • Seznam (bohužel zatím neúplný) Windows PowerShell Features from Microsoft.
  • Sean Kearny začal psát novou sérii Introduction ITPros to Developer Terms. Více na jeho stránkách The Energized Tech.
Pro dnešek je to opět vše. Tentokrát bych ale novinky uzavřel větou. "RTFM platí i v PowerShellu." Více o tom někdy příště.

PowerShell ISE

Novinkou v PowerShellu v2 je PowerShell ISE (Integrated Scripting Environment). Toto prostředí slouží jako konzole a script editor v jednom. Dnes se na něj ve zkratce podíváme. Po installaci je ISE dostupné (spolu s konzolí) v příslušenství nebo jej můžete spustit příkazem powershell_ise.exe.

Já jsem se zhruba před dvěma měsíci rozhodl, že jej na na týden budu používat místo konzole a PowerGUI script editoru a od té doby v něm pracuji většinu času. Pojďme si tedy ISE projít. Skládá se ze tří částí: editoru, konzole a výtupního panelu. Rozložení si oproti standardnímu můžete upravit, takže by se vám nemělo stát, že nenajdete to, co se hodí vám. Možnosti nastavení jsou dostupné pod položkou menu View.

image

Na obrázku vidíte rozvžení, které vyhovuje mě. Většina položek je dostupná přes klávesové zkratky, takže pokud se potřebuji přepnout do zobrazení pouze script editoru, můžu použít Ctrl+3 a zpět se dostanu pomocí Ctrl+1. V případě rozložení, které je ukázáno na obrázku, se lze zárovň rychle přsunout kurzorem mezi editorem (Ctrl+I) a konzoli (Ctrl+D).

Konzole i editor podporují doplňování pomocí klávesy tabulátor a oproti standardní konzoli mají výhodu v tom, že v případě doplňování např. parametru předchozího cmdletu, nemažou znaky za kurzorem. Zkuste si v klasické konzoli a ISE tento příkaz:


Get-Process | Select-Object Name | Format-Table –Autosize

nyní se vraťte kurzorem k cmdletu Select-Object a zkuste k němu pomocí tabulátoru doplnit parametr First.


Get-Process | Select-Object Name -f<Tab> | Format-Table –Autosize


V ISE se vám parametr správně dohledá a v konzoli budete zbytek řádky dopisovat ručně. Celé ISE podporuje standardní práci se schránkou (tedy nikoli tak, jak je to klasické konzoli – pravé tlačítko myši pro vložit ze schránky), vyhledávání ve skriptu, či zvětšování/zmenšování písma.

ISE umožňuje také otevřít další prostředí PowerShellu v nové záložce (Ctrl+T). Otevře se vám nová instance, takže například nové proměnné v této instanci vytvořené nejsou dostupné v jiné záložce (instanci). Dobrou možností je otevření nové instance ze vzdáleného počítače (Ctrl+Shift+R). Je to vlastně obdoba cmdletu Enter-PSSession.

Script editor obsahuje základní vlastnosti, které od editoru vyžadujeme (administrátoři, vývojáři mají určitě nároky vyšší) – zvýrazňování syntaxe, vyhledávání, ale hlavně možnost debugování, včetně nastavování breakpointů. Všechny volby jsou dostupné pod menu Debug.

image

Pro základní krokování skriptu je tato možnost dostačující, ale v případě větších požadavků budete muset stejně použít dostupné cmdlety nebo jiný editor.

Jak jsem řekl na začátku, dnes trávím většinu času v ISE a i když má svá omezení, rozhodně stojí za to, o něm alespoň vědět. Příště si povíme něco o objektovém modelu ISE a některých dostupných rozšířeních.

neděle 14. března 2010

Get-PSNews |? {$_.Week –eq ‘10’}

Minulý týden se u mne nesl ve znamení návštěvy TechNet konference. S potěšením jsem koukal, že skoro všichni přednášející měli na svých počítačích ikonu PowerShellu v Quick Launch panel. Výjimkou byl pouze Michael Juřek, ale jelikož přednášel SQL Server 2008 R2, měl PowerShell dostupný přímo v SQL Server Management Studiu. Pojďme se podívat na novinky.
  • Budu pokračovat SQL serverem. Mé oblíbené SQLPSX se dostalo do verze 2.1 a velkou novinkou je SQLIse, SQL plug-in pro PowerShell ISE. Více na stránkách Chada Millera.
  • Pokud se staráte o SCCM, může se vám hodit SCCM modul. Zatím jsem jej nezkoušel, ale rozhodně to mám v plánu.
  • Taková malá "úchylárna" pro PowerShell fandy, aneb Start-PowerShellPoint, jak na prezentace v konzoli PowerShellu.
  • Pokud se staráte o testovací prostředí a potřebujete často vytvářet nové domény, může se vám hodit skript Create AD test lab.
  • Trošku starší tip, ale opakování, matka moudrosti: Jak vypsat všechny COM objekty v systému.
  • Pokud pronikáte trochu hlouběji do PowerShellího SDK, možná se vám bude hodit návod, jak ve VS 2010 vytvořit vlastní cmdlet.
  • Ještě malá informace závěrem. Pokud máte knihu Lee Holmese, PowerShell Cookbook, můžu vám s radostí oznámit, že třítýdenní review cyklus právě začal, takže se snad brzy dočkáme finálního tisku. Tuto knihu řadím mezi své tři nejoblíbenější.
Přeji příjemný následující týden.

úterý 9. března 2010

Get-PSNews |? {$_.Week –eq ‘09’}

Sice pozdě, ale i tak přicházím s dalším dílem novinek.
Tak to je protentokrát vše. Omlouvám se za zpoždění a doufám, že příště se polepším.

pondělí 1. března 2010

How to check (find) the newest online documentation

Last week I was playing with online documentation for PowerShell cmdlets. If you are not aware - if you specify -Online parameter for Get-Help cmdlet you are redirected to the most recent version located at Microsoft TechNet site. For example:

PS C:\> Get-Help Add-Computer -Online


redirects you to http://technet.microsoft.com/en-us/library/dd347556.aspx where you can check latest version of help.

I wanted to check latest version for cmdlets provided with PowerShell but I didn't want to go cmdlet by cmdlet and manually checked date of last update. As you know - everything in PowerShell is an object (incl. documentation) so I switched to the console and was looking for property storing link to online help. It was pretty easy and shortly I found right way. So after first check I received following results:

PS C:\> Get-Help Add-* |% {$_.relatedLinks.navigationLink} |? {$_.uri}

linkText uri
-------- ---
Online version: http://go.microsoft.com/fwlink/?LinkID=113279
Online version: http://go.microsoft.com/fwlink/?LinkID=113281
Online version: http://go.microsoft.com/fwlink/?LinkID=113280
Online version: http://go.microsoft.com/fwlink/?LinkID=135195
Online version: http://go.microsoft.com/fwlink/?LinkID=113278
Online version: http://go.microsoft.com/fwlink/?LinkID=135194


Then I was able to do quick check of date just by using my Get-WebPage function which uses DownloadString method of Net.WebClient class.

PS C:\> ... | Get-WebPage |% {$_ -match "</p>Updated:\s(?<date>.*?)</p>" | Out-Null ; $Matches.date }

May 20, 2009
October 21, 2009
October 21, 2009
February 17, 2010
February 17, 2010
February 17, 2010
February 17, 2010
February 17, 2010


Cool. But ... as you can see I have dates but no idea which help file to check :( So I decided to create short function (filter) which creates object for info I needed. I decided to store name of the cmdlet, web link and date of update. You can check Get-WebPage and New-TempObj (strange name - I know - but I wanted results quickly).

function Get-WebPage {

[Cmdletbinding()]

param (
[Parameter(Mandatory
=$true,
Position
=0,
ValueFromPipeline
=$true,
HelpMessage
="Enter URL to download")]
[
string]
$Uri
)

BEGIN {
$wc = New-Object System.Net.WebClient
$proxy = [System.Net.WebProxy]::GetDefaultProxy()
$proxy.UseDefaultCredentials = $true
$wc.proxy = $proxy
}

PROCESS {
$wc.DownloadString($Uri)
}

END { }

}

filter New-TempObj {

$hash = @{
name
= $($_.Name)
uri
= $($_.relatedLinks.navigationLink |? {$_.linkText -eq 'Online version:'}).uri
}
[
datetime]$hash.date = Get-WebPage $hash.uri |% {$_ -match "<p>Updated:\s(?<date>.*?)</p>" | Out-Null; $Matches.date}

$myObj = New-Object PSObject -Property $hash
$myObj
}

Now I am able to do following:

PS C:\> Get-Help Add-* | New-TempObj | ft -AutoSize

date name uri
---- ---- ---
20.5.2009 0:00:00 Add-History http://go.microsoft.com/fwlink/?LinkID=113279
20.5.2009 0:00:00 Add-PSSnapin http://go.microsoft.com/fwlink/?LinkID=113281
16.12.2009 0:00:00 Add-Member http://go.microsoft.com/fwlink/?LinkID=113280
20.5.2009 0:00:00 Add-Type http://go.microsoft.com/fwlink/?LinkID=135195
20.5.2009 0:00:00 Add-Content http://go.microsoft.com/fwlink/?LinkID=113278
17.6.2009 0:00:00 Add-Computer http://go.microsoft.com/fwlink/?LinkID=135194


Or - even better - all help files changed in 2010:

PS C:\> get-help *-* | New-TempObj |? { $_.date.Year -eq 2010 } | Select date, name

date name
---- ----
17.2.2010 0:00:00 Get-Counter
17.2.2010 0:00:00 Import-Counter
17.2.2010 0:00:00 Export-Counter
17.2.2010 0:00:00 Start-Job
20.1.2010 0:00:00 New-Module
17.2.2010 0:00:00 Get-Module
17.2.2010 0:00:00 Out-File
17.2.2010 0:00:00 Read-Host
17.2.2010 0:00:00 Export-Clixml
17.2.2010 0:00:00 Select-XML
17.2.2010 0:00:00 Join-Path
20.1.2010 0:00:00 Get-Location
20.1.2010 0:00:00 Set-Location
20.1.2010 0:00:00 Push-Location
20.1.2010 0:00:00 Pop-Location
20.1.2010 0:00:00 New-Item


So now I am able to read latest documentation everytime without any special manual work.

Note: As I said - whole "script" was created in a hurry and therefore it's not the best one I created. You can receive exceptions for some help files but it is not the case for standard cmdlets.

neděle 28. února 2010

Get-PSNews |? {$_.Week –eq ‘08’}

Poslední týden byl na události opět hodně bohatý, takže se budu snažit zprostředkovat vám všechny články, které mne zaujaly.
Víc toho v dnešních poznámkách nemám. I tak to byla slušná porce informací. Těším se na další týden a doufám, že se konečně po olympijském maratónu pořádně vyspím.

.NET třídy – System.Guid

Tento týden jsem na Twitteru narazil na další zajímavou třídu System.Guid. Pokud jste někdy potřebovali vygenerovat GUID a přemýšleli jste jak na to, toto je cesta. GUID je tvořen pěti skupinami čísel sdružených ve tvaru 8-4-4-4-12, např.: 8fff0978-ca4b-4828-9b45-1f0b7818987b.
V celé třídě je nejzajímavější metoda NewGuid().


PS C:\> [System.Guid]::NewGuid()
Guid
----
a7602646-dcd3-425e-8e3d-b0319d5741cf

Občas se vám ještě může hodit i vytvoření prázdného identifikátoru:


PS C:\> [Guid]::Empty
Guid
----
00000000-0000-0000-0000-000000000000

Windows PowerShell Community Doc Review

Před pár dny uveřejnil Shay Levy výzvu dobrovolníkům, kteří chtějí ovlivnit dokumentaci dostupnou v PowerShellu. Originální text:

”We're looking for users at all experience levels and with all different backgrounds, but we love to have beginners, people with no programming experience, people who know other scripting languages or shells, and people who are not native English speakers. If you're a system admin and you don't really know Windows PowerShell, this is a great way to learn it with help from insiders.”

Celý proces probíhá ve spolupráci Windows PowerShell documentation týmu a powershellcommunity.org. Pokud chcete ovlivnit dokumentaci, která je součástí PowerShellu, máte šanci. Napište buď June Blender (juneb@microsoft.com) nebo Marco Shawovi (marco.shaw@gmail.com). Opravdu nezáleží na tom, kolik toho umíte – důležitá je ochota udělat něco pro komunitu. Já jsem June napsal a již jsem dostal potvrzení, že jsem byl zařazen.

Pokud se vám nechce trávit moc času s procházením celé dokumentace, ale přesto jste nalezli nějakou chybu, můžete ji reportovat přes Microsoft Connect.

  1. Ujistěte se, zda chyba existuje v on-line dokumentaci. Použijte parametr –Online v cmdletu Get-Help, např. Get-Help Get-Random –Online. Na webu je vždy poslední verze nápovědy.
  2. Jděte na http://connect.microsoft.com/powershell
  3. Klikněte na Report a bug (nejdříve se přes Search Feedback ujistěte, jestli nebyla stejná chyba již reportována).
  4. Přihlašte se vaším LiveID.
  5. Vyberte Documentation bug.
  6. Vyplňte jednoduchý formulář a odešlete jej.

Každá takto reportovaná chyba jde přímo k June Blender. Pokud vás téma nápovědy zajímá, můžete June sledovat in na Twitteru.

neděle 21. února 2010

Get-PSNews |? {$_.Week –eq ‘07’}

Minulý týden jsem se loučil s přáním medaile pro Martinu Sáblíkovou. Dnes večer ji čeká další závod, tak snad to dopadne stejně :) Ale pojďme k PowerShellu. Uplynulý týden byl opět bohatý na události.
Hokej jsme právě prohráli, tak snad bude příští týden úspěšnější.

pondělí 15. února 2010

.NET třídy – System.Math

Vítejte u nové série. Rozhodl jsem se udělat malého “průvodce” po užitečných .NET třídách. Jako administrátor jsem zjistil, že na MSDN je hromada užitečných věcí. Vím, že pro administrátory je MSDN “obuda, která žere malý děti”, ale nevěřte všemu, co slyšíte :) Je to velmi užitečný zdroj. V této nové sérii bych vám chtěl ukázat třídy, které považuji za užitečné a které jsem sám několikrát s úspěchem použil.

Dnes začnu se System.Math, která je základem, bez kterého se občas neobejdete a i PowerShell team spoléhá na to, že tuto třídu použijete, protože v některých případech uvádí, že neimplementovali nějakou funkci prostě proto, že existuje v System.Math.

Předpokládám, že máte určité znalosti práce s .NET třídami, pokud ne (a nechce se vám je hledat) nechce mi komentář (to by bylo, abych vás nedonutil se rozepsat :)

Sytem.Math je třída, pomocí které můžete používat některé pokročilejší matematické operace. Obsahuje následující metody:

PS C:\> [Math] | gm -Static -MemberType method | fw -c 5
Abs Acos Asin Atan Atan2
BigMul Ceiling Cos Cosh DivRem
Equals Exp Floor IEEERemainder Log
Log10 Max Min Pow ReferenceEquals
Round Sign Sin Sinh Sqrt
Tan Tanh Truncate


Jak vidíte, velkou část zaujímají goniometrické funkce (jak jsem rád, že jsem je od vysoké školy nepoužil a neviděl :). Třída obsahuje také dvě vlastnosti a to pro hodnoty čísel E a PI.


PS C:\> [Math]::E
2.71828182845905
PS C:\> [Math]::PI
3.14159265358979


Při “normální” práci asi nejvíce využijete následující metody:

  • Max(), Min() – vrátí větší/menší ze dvou zadaných čísel.
  • Round() – zaokrouhlí zadané číslo na celé číslo nebo na daný počet míst.
  • Sign() – vrátí hodnotu ukazující znaménko.

Použití předchozích metod je např. následující:


PS C:\> [Math]::Max(1,123)
123
PS C:\> -2..2 |% {[Math]::Sign($_)}
-1
-1
0
1
1


Berte prosím tento článek jako “nutné zlo” do plánované série a užitečných .NET třídách. System.Math opravdu není úplně nejzajímavější.

Budu rád, pokud mi dáte vědět, které třídy rádi používáte nebo o kterých byste se rádi něco dozvěděli. Příště si ukážeme něco zajímavějšího.

neděle 14. února 2010

Get-PSNews |? {$_.Week –eq ‘06’}

Poslední týden byl u mne spíš ve znamení pracovního vytížení a jednoho naprosto zbytečného šestihodinového týmového hledání chyby (ze kterého vyplynulo - NIKDY nevěřete užívatelům, logy nelžou). Co se týče PowerShellu pár zajímavostí se protentokrát také našlo.
  • Začnu tou nejpříjemnější zprávou - Bruce Payette dopsal další kapitoly knihy PowerShell in Action a tyto kapitoly byly uvolněny v rámci MEAP.
  • Twitterem proběhl odkaz na starší sérii článků o použití .NETu v PowerShellu.
  • Momentálně mám rozepsaný první díl série na téma .NET třídy. Chtěl bych se věnovat těm, které jsou z pohledu administrátora zajímavé a možná i důležité. Předpokládám dopsání začátkem příštího týdne (a nebo taky možná až po olympiádě :))
  • Po dlouhé době vyšla nová epizoda Get-Scripting podcastu.
  • Vyšla aktuální verze PowerShell Quick Reference.
  • Objevil jsem nový český blog o PowerShellu.
  • Příští týden začíná MVP Summit a jsem zvědav, co nového se o PowerShellu dostane ven.
  • Zajímá-li vás jak na remote access, podívejte se na vynikající sérii od Ravikanth Chagantiho. Odkazuji na zatí poslední, desátý díl.
Protentokrát končím, jdu fandit Martině Sáblíkové a doufám, že příští týden bude plný nejen sportovních informací.

pondělí 8. února 2010

Get-PSNews |? {$_.Week –eq ‘05’}

Poznámka: S hrůzou jsem zjistil, že jsem minulý týden nastavil špatný datum publikování novinek. Zároveň to bylo dnees asi poprvé, kdy jsem to nezkontroloval hned ráno. Dvě chyby pro jeden článek je až moc.

Poslední týden nebyl tentokrát na novinky nijak bohatý. Přesto se našlo pár zajímavostí.

středa 3. února 2010

Anketa: Jak používáte PowerShell?

Po delší době jsem zde s další anketou. Ještě se vrátím k těm předchozím. Co se týče novinek, obnovil jsem je opět v týdenním režimu, který vám zřejmě vyhovuje nejvíc. Mě osobně taky :) Zároveň jsem neopustil možnost, napsat o nějaké novince, která mne opravdu zaujala, okamžitě. Přechod na angličtinu plánuju se spuštěním nového webu.

Jaká je tedy nová otázka? Zajímalo by mě, pro jakou příležitost používáte PowerShell nejčastěji. Pokud spravujete Exchange, volba je jasná. Pracujete s SCOM, Active Directory, SharePointem, ... Nebo jste většinu času na helpdesku a PowerShell používáte pro vzdálenou správu? Či si jenom skriptujete pro radsot a ulehčujete si práci různými vychytávkami?

Nejčastější možnosti jsem dal jako možnosti v anketě a pokud nenajdete to vaše správné využití, nebojte se nechat komentář pod tímto článkem.

Druhé vydání knihy "PowerShell - Podrobný průvodce skriptováním"

Přemýšlím, jestli nejdřív hledat ikonu typu "víme první" nebo sáhnout do lednice pro nějaké dobré víno a slavit potichu.

Včera večer jsem dělal malý úklid ve svých poznámkách otagovaných jako "someday" a narazil na Napsat Patriku Malinovi, jestli chystá update knížky na v2. O knize Microsoft Windows PowerShell - Podrobný průvodce skriptováním jsem se zde již zmiňoval. Jako jediný počin svého druhu na českém trhu si určitě zaslouží pozornost. Napsal jsem panu Malinovi a dostal následující odpověď.


Pekny vecer.

Pisete jako na zavolanou :-)

... v potu tvare dopracovavam dalsi kapitolu a chystam se ji odeslat redaktorovi. Kniha o PowerShellu 2 je velmi blizko -- tedy odevzdani rukopisu urcite, protoze brzy asi umru a nic vic uz ze mne nevypadne ;-) ...

Protoze ted uz jsem i ja uveril, ze to dodelam, asi to muzete kdyz tak vypustit jako drb do sveta :-))

Zdravi PM


Tradááá - pouštím tedy drb, raduji se a doufám, že pan Malina neumře a ještě hodně toho z něj vypadne :) Bez jeho přednášek by mi bylo fakt smutno.

neděle 31. ledna 2010

Get-PSNews |? {$_.Week –eq ‘04’}

Uplynulý týden byl opět nabitý zajímavý novinkami a také jedním velkým jubileem. Pro mne osobně se vše neslo v tónu Active Directory.

  • Můj oblíbený produkt – PowerGUI - se dočkal verze 2.0. Novinkou jsou snapshoty v administrační konzoli. Pokud vás zajímají další změny, můžete se podívat do release notes.
  • Začal jsem pracovat na dalším článku pro TechNet Flash, tentokrát na téma Active Directory. Proto se mi hodil další online meeting UKPSUG (UK PowerShell User Group), který se věnoval tématu Windows 2008 R2 AD cmdlets. Pokud již W2K8 R2 používáte, může se vám hodit Quick Reference Guide od Jonathana Medda.
  • Další témata meetingů UKPSUG jsou WMI & WQL (na ten se zvlášť těším) a Windows 7. Obojí z pohledu PowerShellu. Více na stránce Richarda Siddawaye.
  • A ještě jednou Richard – oznámil progres u jeho knihy PowerShell in Practice.
  • Další (velmi vítanou) novinkou je informace o další knize od Manning PublicationsPowerShell in Action, Second Edition. Prvních 15 kapitol je téměř hotovo a měly by být “circulated shortly”. Oproti původnímu plánu byly přidány tři nové kapitoly, takže zatím je celkem plánováno 19 kapitol a čtyři přílohy.
  • Třetí knihou v dnešním přehledu je PowerShell 2.0 TFM. E-book už je dostupný na stránkách Sapien Press. Pokud s PowerShellem začínáte, toto je dle mého názoru pro vás ta nejvhodnější kniha.
  • PowerShell Community Extensions jsou nyní ve fázi bety verze 2.0. Stahovat můžete přímo ze stránek PSCX.
  • Stejcz publikoval skript pro hledání překladu na slovnik.cz. Dost mě to potěšilo, protože jsme se o tomto skriptu před nějakou dobou bavili a já se u něho zasek :( Pokud chcete hledat překlady slov mezi angličtinou a češtinou, podívejte se na modul Translate.

Poslední příspěvek mne vedl z zamyšlení na téma “proč mám rád, když programátoři vytvářejí skripty”. Vzhledem k tomu, že mne ve škole programování nebavilo (dneska bych si kvůli tomu nejradši dal sám pár facek), doháním vše až nyní. Vím, že to je marná snha, ale čtení kódu po zkušenějším mne baví. Více v některém z dalších článků.

Doplnění: Pro samá písmenka jsem zapomněl zmínit to jubileum :( Můj oblíbený PowerScripting Podcast se dočkal epizody s pořadovým číslem 100! Gratuluji Halovi a Jonathanovi a děkuji jim za práci, kterou odvádějí. Jejich podcast byl pro mne impulsem, který mne nakopl v mém PowerShellovském bádání.

čtvrtek 28. ledna 2010

PSRemoteRegistry modul

[EN: Autotranslation]

Jak jsem již psal v posledních Get-PSNews, Shay Levy publikoval modul PSRemoteRegistry. Než se vrhneme na popis, podívejme se, jaké možnosti pro přístup do registru (lokálně či vzdáleně) máme nyní.

  1. Lokálně přes PSDrives: Get-PSDrive -PSProvider *Registry - asi nejčastější metoda, kterou budete používat z konzole nebo ve skriptech.
  2. Vzdáleně přes např. Invoke-Command, Enter-PSSession, ...
  3. Vzdáleně či lokálně přes WMI pomocí třídy StdRegProv. Obsahuje množství zajímavých metod, pokud jste v dobách VBS chtěli prohledat vzdálený registr, byla metoda EnumKey možná vaše první volba.
  4. Vzdáleně či lokálně před .NET třídy Microsoft.Win32.Registry*

Právě čtvrtý způsob využívá popisovaný modul, který zmiňované třídy zapouzdřuje do funkcí. Stáhnout si jej můžete z MSDN, kde je zároveň popsáno, jak jej správně importovat do PowerShellu. Seznam dostupných funkcí je vypsán na stránkách modulu, sami si jej můžete vylistovat pomocí Get-Command -Module PSRemoteRegistry. V tomto článku se můžete podívat na matici funkcí a dostupných parametrů. Součástí modulu je i tématická nápověda about_RemoteRegistry_Module.

Nejprve si ukážeme práci s lokálním počítačem a na konci článku uvedu, jak se lze dotazovat vzdálených počítačů. Otestujme, jestli existuje námi požadovaná větev.

PS C:\> Test-RegKey -Key "SOFTWARE\Makovec"
False



Neexistuje, takže ji vytvoříme

PS C:\> New-RegKey -Key SOFTWARE -Name Makovec
PS C:\> Test-RegKey -Key "SOFTWARE\Makovec"
True



Výborně, nyní si vytvoříme pár testovacích hodnot

PS C:\> 1..10 | % { Set-RegString -Key SOFTWARE\Makovec -Value "RegString$_" -Data $(Get-Random) -Force }



Všimněte si parametru -Force. Pokud jej neuvedete, budete vyzváni, abyste potvrdili zápis (bezpečnostní pojistka). Nyní si můžeme hodnoty zkontrolovat.

PS C:\> Get-RegKey -Key SOFTWARE -Name Makovec
ComputerName Hive Key SubKeyCount ValueCount
------------ ---- --- ----------- ----------
NETBOOK LocalMachine SOFTWARE\Makovec 0 10

PS C:\> Get-RegKey -Key SOFTWARE -Name Makovec | Get-RegValue
ComputerName Hive Key Value Data Type
------------ ---- --- ----- ---- ----
NETBOOK LocalMachine SOFTWARE\Makovec RegString1 1249268748 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString2 1967993881 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString3 1010703330 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString4 86413294 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString5 917742177 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString6 74280723 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString7 526159413 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString8 205545931 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString9 286790375 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString10 2007859651 String



Pojďme si ukázat příklad ze života. Potřebujeme zjistit, na jakém portu komunikuje náš SMS klient na jednotlivých počítačích.

PS C:\> 'PC1','PC2','PC3','PC4' | Get-RegValue -Key SOFTWARE\Microsoft\CCM -Value httpport | ft ComputerName, Value, Data -AutoSize

ComputerName Value Data
------------ ----- ----
PC1 HttpPort 1234
PC2 HttpPort 1111
PC3 HttpPort 1234
PC4 HttpPort 1234


Vidíme, že PC2 potřebuje nutně změnu. Pokud pustíte skript přes více počítačů ve vaší síti, může se stát (a určitě se stane), že některé počítače budou nedostupné a obdržíte chybovou zprávu: Get-RegValue : Exception calling "OpenRemoteBaseKey" with "2" argument(s): "The network path was not found. Pro tyto případy jsou všechny funkce z PSRemoteRegistry modulu vybaveny parametrem -Ping a pokud jej použijete dostanete jasnou zprávu, kde se stala chyba.

PS C:\> 'PC1','PC2','PC3','PC4' | Get-RegValue -Key SOFTWARE\Microsoft\CCM -Value httpport -Ping | ft ComputerName, Value, Data -AutoSize

WARNING: [PC2] doesn't respond to ping.
WARNING: [PC3] doesn't respond to ping.
ComputerName Value Data
------------ ----- ----
PC1 HttpPort 1234
PC4 HttpPort 1234


Do připravovaného článku pro TechNet Flash jsem přidal ukázku, jak použít předchozí příklad na všechny počítače ve vaší doméně. Abych nezapomněl, měli bychom po sobě uklidit.

PS C:\> Remove-RegKey -Key SOFTWARE\Makovec -Force


Musím přiznat, že PSRemoteRegistry jsem okamžitě přidal do svého profilu a za těch pár dní, co jej používám se stal nenahraditelným pomocníkem. Pokud budete někdy potřebovat přistupovat ke vzdáleným registrům, tento modul je pro vás prostě must have.

Uložení záložek z IE7

[EN: Autotranslation]

Poslední dobou se na konci každého pracovního dne probírám otevřenými záložkami v Internet Exploreru a říkám si, kdy to asi budu číst. Většinou přes den otvírám všechno, co mi přijde zajímavé (což jsou pro mne na Twitteru všechny zprávy o PowerShellu :) a pak nestíhám všechno přes den číst. Proto jsem začal používat Evernote a nepřečtené stránky si synchronizuji, abych si je přečetl večer doma. Jelikož jsem vždy ručně kopíroval všechny adresy, nebylo to zrovna pohodlné a rychlé. Rozhodl jsem se, že si tedy udělám skript, který mi všechny otevřené stránky do Evernote klienta nahraje.

Nejprve jsem si myslel, že budu každou instanci IE spouštět z PowerShellu a na konci dne prostě projdu všechny záložky. Což jsem samozřejmě zavrhl okamžitě (vzhledem k množství oken otevíraných externími aplikacemi). Začal jsem brouzdat a objevil příspěvek na Stack Overflow. Celé řešení využívalo COM Shell.Application, který jsem následně využil.

Nejprve jsem jako součást skriptu přidal i možnost exportu do Evernote. Pak jsem ale podlehl (správné :) myšlence na modularitu a pro export vytvořil novou funkci Export-Evernote. Tak můžu v rouře volat libovolný cmdlet a výsledky si číst doma.

Celá funkce tedy vypadá následovně:

function Export-IETabName {

$(
New-Object -Com 'Shell.Application').Windows() |
? {
$_.Name -eq 'Windows Internet Explorer' } |
? {
$_.LocationURL -notlike 'https://remedy*' } |
Select LocationName, LocationURL

}
# function Export-IETabName

Ze všech objektů, které vrátí metoda Windows(), vyberu instance Internet Exploreru, vyfiltruji záložky obsahující stránky, které doma číst nechci (zde Remedy) a dále posílám pouze jméno stránky a její adresu. Před odchodem, tedy mohu použít následující kód

PS C:\> Export-IETabName | Export-Evernote -Sync


a poté mohu s klidem vypnout počítač a odejít.

neděle 24. ledna 2010

Get-PSNews |? {$_.Week –eq '03'}

Uplynulý týden se nesl ve znamení následujících událostí

Posledních několik týdnů se také mluví o větší popularizaci PowerShellu mezi (hlavně) administrátory. Nejvíce je nyní v této souvislosti asi slyšet Jeff Hicks (samozřejmě ale není jediný), který byl hostem v dnes již jednou zmiňovaném podcastu Mind of Root. Poté napsal i krátký příspěvek v jeho blogu. Proto bych chtěl dnešní noviky opět ukončit několika otázkami a budu moc rád, pokud mi na ně odpovíte (klidně se rozepište více :)). Mé odpovědi najdete v komentářích.

  1. Jak dlouho s PowerShellem pracujete?
  2. Pro jaké úkoly PowerShell používáte?
  3. Snažíte se propagovat PowerShell ve vaší práci a nebo si jej radši necháváte pro sebe, abyste měli náskok před kolegy.

neděle 17. ledna 2010

Get-PSNews |? {$_.Week -eq '02'}

Tak jsem tady s druhými letošními novinkami. Tentokrát jich nebude tolik jako před týdnem, ale zato je mezi nimi jedna bomba (tedy alespoň pro mě). Hodně se dnes budeme motat v rouře :)

pondělí 11. ledna 2010

Hrátky s parametry

[EN: Autotranslation]

Dnes jsem si hrál s modulem PSRemoteRegistry od Shaye Levyho. Testoval jsem různé parametry a napadlo mě, vypsat si tabulku, kde v řádkách budou vylistované funkce a ve sloupcích jednotlivé parametry. Vznikl mi následující výtvor:



Poté mě napadlo udělat malou statistiku pro standardní cmdlety. Nevím, jestli je to užitečné, ale já jsem se při tvorbě skriptu i výsledků dobře bavil :)

  • Počet cmdletů v modulech Microsoft.*: 236
  • Počet parametrů použitých v těchto cmdletech: 449
  • Počet kombinací cmdlet/parametr: 3491
  • Parametry, které jsou dostupné pro každý cmdlet: Zde určitě nikoho nepřekvapí (pokud ano, Get-Help about_CommonParameters je váš přítel pro následujících 10 minut :), že jsou to takzvané Common Parameters: Verbose, Debug, WarningAction, WarningVariable, ErrorAction, ErrorVariable, OutVariable, OutBuffer. Vyskytují se - ano, hádáte správně - 236x.
  • Další v pořadí jsou: Confirm, WhatIf (85), Force (68), Name (67), InputObject, Credential (54), Path (52). Ostatní parametry se vyskytují méně než 50x.
  • Parametrů, které se vyskytují pouze u jednoho cmdletu je 270.
  • Cmdlet s největším počtem parametrů: New-ModuleManifest (38)
  • Další v pořadí: Invoke-Command (28), New-PSSessionOption (28), Get-WSManInstance (28), Get-WmiObject (26), Set-WmiInstance, Invoke-WmiMethod (25).
  • Nejméně parametrů: Get-Culture, Get-Transaction, Get-Host, Get-PSCallStack, Get-UICulture, Exit-PSSession, Stop-Transcript, Get-WSManCredSSP (8).
Určitě bych mohl pokračovat dále, ale myslím, že tohle pro přehled stačí. Pokud chcete dělat vlastní výzkumy, zde je kód:




  1. function Get-CommandParameter {   

  2.   

  3.     param (   

  4.         [Parameter(   

  5.             ValueFromPipeline=$true,   

  6.             ValueFromPipelineByPropertyName=$true  

  7.         )]         

  8.         [string[]]$Name=""  

  9.     )   

  10.        

  11.     PROCESS {   

  12.            

  13.         foreach ($c in $Name) {   

  14.   

  15.             # receive all parameters   

  16.             $cParams = (Get-Command $c).Parameters.Keys   

  17.                

  18.             # process every parameter and create object   

  19.             foreach ($p in $cParams) {   

  20.            

  21.                 $psObj = New-Object PSObject -Property @{   

  22.                     Command=$c  

  23.                     Parameter=$p  

  24.                 } # psObj        

  25.                    

  26.                 $psObj         

  27.             } # foreach $p   

  28.         } # foreach $c     

  29.     } # PROCESS   

  30. # function Get-CommandParameter  


Použití je poté následující:
PS C:\> $a = Get-Command -CommandType cmdlet Get-CommandParameter
PS C:\> $a.Count
3491

neděle 10. ledna 2010

Get-PSNews |? {$_.Week -eq '01'}

V minulém článku jsem uvedl špatné číslo týdne. Po konzultaci s kalendářem jsem zjistil, že první týden nového roku je ten uplynulý. Zároveň jsem se rozhodl zkrátit název článku a z dlouhého textu jsem vypustil Write-Host (které bych asi stejně změnil na Write-Output) i vlastnost CreationTime. Nyní je název kratší a číslo týdne je viditelné na první pohled. Co nám tedy první týden nového roku přichystal na poli PowerShellu:

sobota 9. ledna 2010

Hej, mistře Šelíku!

Mistr Skriptík se doslechl, že PowerShell je nyní ve verzi 2 a zajímalo ho, jestli by mistr Šelík neměl nějaký tip na vypnutí vzdáleného počítače bez použití WMI.



Brutalita a přímočarost Šelíkova řešení je odporná:

PS C:\Stop-Computer netbook

Vzdálený počítač se vypne a do logu se zapíše následující informace:

PS C:\Get-EventLog -LogName System -ComputerName netbook -Source user32 -Newest 1

EntryType : Information
Source : USER32
Message : The process winlogon.exe has initiated the restart of NETBOOK for the following reason: No title for this reason could be found
Minor Reason: 0xff
Shutdown Type: shutdown
Comment:

V PowerShellu v2 byly přidání cmdlety pro práci se vzdáleným počítačem, protože vypnutí (ale hlavně restart) vzdáleného počítače je jeden ze základních administrátorských úkonů. Jsou dostupné následující cmdlety:
  • Add-Computer a Remove-Computer pro přidávání/odebírání počítače z/do domény nebo pracovní skupiny.
  • Checkpoint-Computer a Restore-Computer pro práci se System restore.
  • Restart-Computer a Stop-Computer pro vzdálený restart nebo vypnutí počítače.

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

čtvrtek 7. ledna 2010

Recenze: Windows PowerShell 2.0 Best Practices

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

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

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

Část 1. – Úvod

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

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

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

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

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

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

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

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

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

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

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

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

Část 3. – Design

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

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

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

Část 5. – Optimalizace

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

Přílohy

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

Shrnutí mých dojmů

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

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