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:
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.