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.