Seriál Windows PowerShell – Tip na práci s časem (část 39.)

Dnešní článek bude takové malé zamyšlení nad plynoucím časem. Poslední dobou hodně pracuji s ConfigMgr 2012 SP1 (a už se netrpělivě těším na nový ConfigMgr 2012 R2). Jakožto člověk pracující převážně s PowerShellem se mi líbí možnost použít ConfigMgr cmdlety z konzole a „nezdržovat“ se s přechodem do GUI. I v časech ConfigMgr 2007 jsem hodně věcí řešil vlastními skripty (což mi teď připomnělo můj starý PowerGUI PowerPack pro SMS 2003).

Častou operací při práci s ConfigMgr 2012 (dále budu psát jen CM) je kontrola chyb různých komponent. Pro tento účel existuje cmdlet Get-CMSiteStatusMessage. Tento cmdlet má jeden povinný parametr: ViewingPeriod.

PS MT0:\> Get-CMSiteStatusMessage –ViewingPeriod “2013/08/21 08:00:00” –Severity Error | Measure-Object

Count : 37 
Average : 
Sum : 
Maximum : 
Minimum : 
Property :

Ve výpisu jsem dostal seznam chyb, které se momentálně vyskytují v mém labu. Čas je zadaný ve formě textu (formát US). Osobně nemám zadávání času tímto způsobem moc rád, radši používám cmdlet Get-Date a z něj odvozené časové konstanty. Zároveň chci při práci s konzolí zadávat čas ve tvaru „ukaž mi, co se stalo za poslední dvě hodiny“ než jej zadávat jako hodnotu. Pojďme si předchozí příklad přepsat.

PS MS0:\> $time = (Get-Date).AddHours(-2) 
PS MT0:\> Get-CMSiteStatusMessage –ViewingPeriod $time –Severity Error | Measure-Object | Select Count

Count 
----- 
10

Nyní je vidět, že jsem si vytvořil proměnnou time, která obsahuje hodnotu času před dvěma hodinami. Tuto proměnnou poté použiji v daném cmdletu.

Touto cestou si můžeme vytvořit několik dalších časových konstant dle libosti. Můžeme se podívat, jaké konstanty v současnosti používám na jednom ze svých CM serverů:

PS MT0:\> dir Variable: |? value -is [datetime]

Name                 Value 
----                 ----- 
LastDay              6. 09. 2013 13:40:21 
LastHour             7. 09. 2013 12:40:21 
NextHour             7. 09. 2013 14:40:21 
PredHodinou          7. 09. 2013 12:40:21 
Tomorrow             8. 09. 2013 13:40:21 
Vcera                6. 09. 2013 13:40:21 
ZaHodinu             7. 09. 2013 14:40:21 
Zitra                8. 09. 2013 13:40:21

PS MS0:\> $Vcera

6. října 2013 13:40:26

Tento kód vylistuje všechny proměnné a vypíše pouze ty, které mají hodnotu typu DateTime. Proto jsem mohl použít i například tuto konstrukci:

PS MT0:\> Get-CMSiteStatusMessage –ViewingPeriod $PredHodinou –Severity Error | Measure-Object | Select Count

Count 
----- 
4

Vytváření všech těchto proměnných probíhá ve funkci prompt a proto je čas v nich uložený „vždy“ aktuální, resp. Jedná se o čas, kdy jsem provedl předchozí příkaz. Pokud chcete opravdu naprosto přesný čas, řešení naleznete na konci článku.

V definici funkce prompt, mám uvedeno (uvádím pouze malou část kódu):

function prompt 

  $Global:LastHour = [System.DateTime]::Now.AddHours(-1) 
  $Global:LastDay = [System.DateTime]::Now.AddDays(-1) 
  $Global:Today = [System.DateTime]::Today 
  “$pwd>” 
}

Všimněte si proměnné Today. Oproti standardnímu Get-Date obsahuje čas o půlnoci dnešního dne a proto opravdu vypíše případné chyby vzniklé po půlnoci.

Za pomoci těchto proměnných si také mohu zadávat upomínky do kalendáře. Tím, že většinu času trávím v konzoli PowerShellu (nebo ji mám opravdu nadosah), mohu použít následující konstrukci:

PS MT0:\> New-OutlookReminder -Subject 'Upominka pro Flash' -DateTime $Zítra

A opravdu se mi v kalendáři objeví upomínka na zítra:

image

Samozřejmě by zapisování tak dlouhého textu nebylo příjemné a proto jsem jej minimalizoval použitím aliasu a nastavením vlastností parametrů. Proto mi zápisy

PS MT0:\> rem 'Dalsi upominka'

PS MT0:\> rem 'A jeste jedna' (hod 3)

Přidají upomínku na čas za hodinu (defaultní hodnota) nebo za tři hodiny (přičemž hod je alias pro další funkci pracující s časovými konstantami).

Jak jsem již řekl. Hodnota uložená v proměnných je časovým údajem uloženým při posledním běhu funkce prompt. Proto může dojít k určitým odchylkám. Před několika měsíci byl na webu PowerShell.com uveden návod na vytvoření opravdové proměnné měnící svoji hodnotu za běhu:

$Global:Now = Set-PSBreakpoint -Variable Now -Mode Read -Action { Set-Variable Now (Get-Date-Option ReadOnly, AllScope -Scope Global -Force }

Zde se využívá možnosti breakpointu nastaveného na čtení proměnné. Při tomto čtení se zároveň hodnota proměnné změní.

Doufám, že jste dnes dostali užitečný tip, jak si lze ulehčit práci v PowerShellu za pomoci jednoduchých proměnných.