ID d'événement Windows pour le changement de niveau de batterie

9

J'ai besoin de créer une tâche dans TS en fonction du changement de niveau de batterie. Disons que ma batterie passe de 67% à 66% . Comment puis-je exécuter une tâche basée sur cet événement. Windows enregistre-t-il cela du tout? Je n'ai trouvé cette information nulle part.

RiddleMeThis
la source
Quelle version de Windows?
DavidPostill
WIndows 10 (et de préférence W7 également)
RiddleMeThis

Réponses:

11

Je dois créer une tâche dans le Planificateur de tâches en fonction du changement de niveau de batterie

Windows n'enregistre pas ce type de détails en tant qu'événements. Vous pouvez cependant utiliser quelque chose comme le fichier de commandes ci-dessous et créer un événement personnalisé.


Battery.cmd

Ce fichier de commandes surveille le pourcentage de charge actuel de la batterie et crée un événement défini par l'utilisateur si la charge tombe en dessous d'une valeur seuil définie par l'utilisateur.

@echo off
setlocal EnableDelayedExpansion
rem set threshold value
set _threshold=82
:start
rem get the battery charge
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1" %%i in (`wmic Path Win32_Battery Get EstimatedChargeRemaining ^| findstr /r /v "^$"`) do (
  set _charge=%%i
  echo !_charge!
  if !_charge! lss !_threshold! (
    echo threshold reached
    rem create a custom event in the application event log
    rem requires administrator privileges 
    eventcreate /l APPLICATION /t WARNING /ID 999 /D "Battery charge has dropped"
    goto :done
    ) else (
    rem wait for 10 minutes then try again
    timeout /t 600 /nobreak
    goto :start
    )
  )
:done
endlocal

Remarques:

  • La Eventcreatecommande fonctionne sur Windows XP jusqu'à Windows 10 inclus, elle nécessite des privilèges d'administrateur pour fonctionner
  • Définir _thresholdcomme requis
  • Si la batterie tombe en dessous de cette valeur, un événement avec ID 999sera généré dans le journal des événements APPLICATION avec la descriptionBattery charge has dropped
  • Modifiez la eventcreatecommande selon vos besoins.
  • Modifiez le timeoutdélai selon vos besoins.

Exemple de sortie:

Ma batterie est actuellement chargée à 81%. J'ai fixé le seuil à 82. Voici ce qui se passe quand je cours Battery.cmd:

> battery
81
threshold reached

SUCCESS: An event of type 'WARNING' was created in the 'APPLICATION' log with 'EventCreate' as the source.

Et voici la nouvelle entrée dans le journal des événements:

entrez la description de l'image ici


syntaxe eventcreate

EVENTCREATE [/S system [/U username [/P [password]]]] /ID eventid
            [/L logname] [/SO srcname] /T type /D description

Description:
    This command line tool enables an administrator to create
    a custom event ID and message in a specified event log.

Parameter List:
    /S    system           Specifies the remote system to connect to.

    /U    [domain\]user    Specifies the user context under which
                           the command should execute.

    /P    [password]       Specifies the password for the given
                           user context. Prompts for input if omitted.

    /L    logname          Specifies the event log to create
                           an event in.

    /T    type             Specifies the type of event to create.
                           Valid types: SUCCESS, ERROR, WARNING, INFORMATION.

    /SO   source           Specifies the source to use for the
                           event (if not specified, source will default
                           to 'eventcreate'). A valid source can be any
                           string and should represent the application
                           or component that is generating the event.

    /ID   id               Specifies the event ID for the event. A
                           valid custom message ID is in the range
                           of 1 - 1000.

    /D    description      Specifies the description text for the new event.

    /?                     Displays this help message.


Examples:
    EVENTCREATE /T ERROR /ID 1000
        /L APPLICATION /D "My custom error event for the application log"

    EVENTCREATE /T ERROR /ID 999 /L APPLICATION
        /SO WinWord /D "Winword event 999 happened due to low diskspace"

    EVENTCREATE /S system /T ERROR /ID 100
        /L APPLICATION /D "Custom job failed to install"

    EVENTCREATE /S system /U user /P password /ID 1 /T ERROR
        /L APPLICATION /D "User access failed due to invalid user credentials"

Lectures complémentaires

DavidPostill
la source
J'aime vraiment ça! À partir de votre POV, il est préférable de créer des événements et d'exécuter une tâche basée sur les événements (par exemple, script PS)? Ou ... modifiez ce script pour exécuter mon script PS, si le niveau de la batterie baisse de 1%. J'ai supposé que Windows crée des événements pour le changement de niveau de batterie. Je n'ai pas pensé à cette approche, qui pourrait être meilleure.
RiddleMeThis
1
@MiHa À vous. Selon ce qui est le plus facile à comprendre et à maintenir :)
DavidPostill
6

Il existe un Microsoft-Windows-Batteryfournisseur ETW avec un BatteryPercentRemainingévénement avec l'ID 13. Vous pouvez coder un projet qui utilise TraceEvent pour créer un écouteur en temps réel pour ce Microsoft-Windows-Batteryfournisseur. L'événement a les entrées RemainingPercentagepour afficher le statut et PercentageChangevoir le changement:

entrez la description de l'image ici

Lorsque vous voyez cet événement et voyez la -1modification pour PercentageChange, exécutez le programme souhaité.

magicandre1981
la source
2

OK, le script fourni par DavidPostill ne fonctionne pas. C'est un joli petit script, mais le code est erratique ou obsolète.

Voici le fixe:

@echo off
setlocal EnableDelayedExpansion
rem set threshold value
set _threshold=30
:start
rem get the battery charge
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1" %%i in (`wmic Path Win32_Battery Get EstimatedChargeRemaining ^| findstr /r /v "^$"`) do (
  set _charge=%%i
  echo !_charge!
  if !_charge! lss !_threshold! (
    echo threshold reached
    rem create a custom event in the application event log
    rem requires administrator privileges
    eventcreate /l APPLICATION /t WARNING /ID 999 /D "Battery charge has dropped below the threshold."
    goto :done
  ) else (
    rem wait for 1 minute then try again
    timeout /t 60 /nobreak
    goto :start
  )
)
:done
endlocal

J'ai suggéré cette modification dans la réponse de DavidPostill, mais je ne sais pas pourquoi elle n'a pas été approuvée ...

AneesAhmed777
la source
Il m'a mis sur la bonne voie, c'est pourquoi j'ai accepté sa réponse, mais merci beaucoup! pour votre script fixe.
RiddleMeThis
En corrigeant le code, je me suis rendu compte à quel point il était bogué et erroné findstr... Trop dommage! Sérieusement, Microsoft? Je suis impressionné par le petit hack sale de DavidPostill pour faire le travail.
AneesAhmed777
0

Il existe un moyen beaucoup plus simple de vérifier le niveau de la batterie. Dans la zone de navigation, placez la souris sur l'icône de la batterie et cela donnera un pourcentage.

Gary Weinstein
la source
Oui, mais ce n'est vraiment pas ce que je voulais ... Je voulais surveiller le niveau de la batterie automatiquement et en fonction du niveau de la batterie faire (encore une fois automatiquement)
RiddleMeThis
Veuillez relire attentivement la question. Votre réponse ne répond pas à la question d'origine.
DavidPostill