Script para comprobar la batería

En el trabajo me cambiaron la notebook y eso genera un montón de cosas (buenas y malas); reinstalar software, acomodar algunas cosas y configurar otras tantas. Debido a que me gusta el scripting, tengo un script para ello. Obviamente está escrito en PowerShell (acá el enlace) para no tener que recorrer el mismo camino todas las veces. También, al ser un equipo nuevo, siempre intentamos cuidarlo al máximo. Por lo tanto es que se me cruzó por la cabeza el problema de la batería (que fue uno de los motores impulsores al cambio), y el por qué no crear un script para comprobar la batería.

Charlando con un compañero llegamos a una conclusión inicial sobre el cuidado de las baterías. Para extender la vida útil de la batería es necesario monitorear los ciclos de conectar/desconectar a la corriente el equipo para que nunca llegue a menos del 20% de la carga y nunca supere el 80%. Esto en base a lecturas previas sobre el tema, conocimiento heredado de la vida y una pequeña investigación al momento de la charla.

Así que, sin tener mayor fundamento que lo expuesto anteriormente me dispuse a armar un script para monitorear el proceso de carga. Como consecuencia de lo anterior, al momento de llegar a los extremos definidos, genere un pop up indicando que debo tomar acciones.

¿Dónde consulto la información de la batería?

Tomando en cuenta mi acotado conocimiento sobre WMI, es posible que exista alguna clase que pueda ser mi punto de partida para empezar a recolectar datos. Efectivamente existe una clase que se llama **[Win32Battery](https://msdn.microsoft.com/en-us/library/aa394074%28v=vs.85%29.aspx)** que nos comparte información sobre la batería. Ejecutando _Get-WmiObjet obtenemos lo siguiente:

Get-WmiObject Win32_Battery

En donde la propiedad EstimatedChargeRemaining, representa el valor que se indica en el ícono de batería en la barra de tareas:

Get-WmiObject Win32_Battery

Tener en cuenta que el otro indicador que tenemos que prestar atención es BatteryStatus que indica, según la documentación, el estado en que se encuentra la batería (si se encuentra descargándose y otras condiciones que no vienen al caso). Por tanto recomiendo que ejecuten lo siguiente, conectados a la corriente o solamente usando la batería:

Script para comprobar la batería

Frente a la información anterior, podemos armar un simple script para comprobar la batería:

if ((Get-WmiObject Win32_Battery).BatteryStatus -ne 1) {
    if ((Get-WmiObject win32_battery).EstimatedChargeRemaining -gt 80) {
      Write-host "Desconectar de la corriente!"
    }
  } else {
    if ((Get-WmiObject win32_battery).EstimatedChargeRemaining -lt 20) {
      Write-host "Conectar el equipo!"
    }
  }

Debido al objetivo del post, vamos a continuar resolviendo el problema de los pop-ups Para ello existen varias maneras de resolver esto. En este post voy a compartir la que para mí es la más fácil:

$wshell = New-Object -ComObject Wscript.Shell
  $wshell.Popup("Desconectar la notebook",0,"Alerta",0x0 + 0x30)

Popup Method

Finalmente vamos a tener el siguiente script:

if ((Get-WmiObject Win32_Battery).BatteryStatus -ne 1) {
    if ((Get-WmiObject win32_battery).EstimatedChargeRemaining -gt 80) {
      $wshell = New-Object -ComObject Wscript.Shell
      $wshell.Popup("Desconectar de la corriente!",0,"Alerta",0x0 + 0x30)
    }
  } else {
    if ((Get-WmiObject win32_battery).EstimatedChargeRemaining -lt 20) {
      $wshell = New-Object -ComObject Wscript.Shell
      $wshell.Popup("Conectar el equipo!",0,"Alerta",0x0 + 0x30)
    }
  }

En conclusión resta programar para que se ejecute según el tiempo que consideremos necesario. Si no saben como hacerlo, hace un tiempo escribí sobre ello: Ejecutar script de manera programada.

También podríamos generar una función para simplificar la ejecución:

function Check-BatteryPercentage {
    if ((Get-WmiObject Win32_Battery).BatteryStatus -ne 1) {
      if ((Get-WmiObject win32_battery).EstimatedChargeRemaining -gt 80) {
        $wshell = New-Object -ComObject Wscript.Shell
        $wshell.Popup("Desconectar de la corriente!",0,"Alerta",0x0 + 0x30)
      }
    } else {
      if ((Get-WmiObject win32_battery).EstimatedChargeRemaining -lt 20) {
        $wshell = New-Object -ComObject Wscript.Shell
        $wshell.Popup("Conectar el equipo!",0,"Alerta",0x0 + 0x30)
      }
    }
  }

Happy scripting!

Comments