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.