Temps al temps, timers (comptadors) al Powershell
Avui m’he trobat amb una petita necessitat al Powershell, al mateix moment que necessitava tenir un formulari, també tenia la necessitat de que en aquest aparagués un compte enrere.
Les opcións més ràpides era emprar compració de temps, capturant l’inicial i indicant quants segons havien passat des d’aquest punt. L’altre era utilitzar un StopWatch, una sort de cronometre que ens permet tenir un càlcul mes fàcil de consultar (segons, minuts, hores…) des del moment que l’iniciem.
Però el problema és que, entre lectura i lectura, si faig un Start-Sleep (o Sleep a seques), l’aplicació queda completament parada i, necessito que l’usuari faci click a un botó. Bàsicament buscava un formulari amb un compte enrere i que aquest el pugui aturar.
Així que, tal i com jo veig Powershell i sobretot conjutament amb Windows.Forms, és que no deixa de ser una sort de Visual Basic de la vella escola, així que em vaig preguntar “com ho faria això jo en Visual Basic?” i la solució era amb un Timer.
El Timer era (i és) un “objecte” (permeteu que em refereixi a objectes d’una forma visual, no en el llenguatge de programació en el que tots sabem que VB no és un llenguatge orientat a objectes) que ens permet executar “alguna cosa” cada X ms que li indiquem.
Un cop mirat que Windows.Forms suporta Timers sols calia veure com es cridaven i es configuraven, amb 5 línies en tenim prou per entendre com crearlo (aquesta és la senzilla) i com prendre control d’aquest.
$timer=New-Object System.Windows.Forms.Timer
$timer.Interval=1000
$timer.add_Tick({CountDown})
$timer.Start()
$timer.Stop()
Com he dit, la primera és la fàcil, creem un nou objecte $timer, la segona va pel camí, indiquem l’interval en mili segons (1000ms = 1segons).
La tercera opció és el Tick, què ha de fer el nostre Timer cada cop que passi l’interval que hem indicat? Simplement li indiquem la funció o operació que ha de realitzar, si és una cosa senzilla no cal fer una funció a part si és que no ho requereix la resta de codi, però sempre és recomanable orientar a una funció per tenir tot molt més ordenat. Per tant, aquest Tick anirà repetint-se cada “interval” de temps que l’hi indiquem.
Les dues últimes ens permeten iniciar (Start) i parar (Stop) el nostres timer (ull, Stop és parar, no pausar, quan el reiniciem aquest comença a 0!). Cal tenir en compte que si estem a l’ISE fent probes, és important que tanquem el $timer manualment si hem tingut algun problema, si no es queden actius i ens pode fer la punyeta.
Aquest cop no us presento cap aplicació que en faci ús, com tampoc us poso cap codi útil, quan acabi amb la que estic fent us la presento i així no caldrà tanta explicació.
PD: Per descomptat heu de carregar Windows.Forms:
Add-Type -AssemblyName System.Windows.Forms