ID de evento do Windows para alteração do nível da bateria

9

Preciso criar uma tarefa no TS com base na alteração do nível da bateria. Digamos que minha bateria caia de 67% para 66% . Como posso executar uma tarefa com base neste evento. O Windows registra isso? Não consegui encontrar essas informações em lugar algum.

RiddleMeThis
fonte
Qual versão do Windows?
DavidPostill
Windows 10 (e de preferência também o W7)
RiddleMeThis

Respostas:

11

Preciso criar uma tarefa no Agendador de tarefas com base na alteração do nível da bateria

O Windows não registra esse tipo de detalhe como eventos. No entanto, você pode usar algo como o arquivo em lotes abaixo e criar um evento personalizado.


Battery.cmd

Esse arquivo em lote monitora a carga percentual da bateria atual e cria um evento definido pelo usuário se a carga cair abaixo de um valor limite definido pelo usuário.

@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

Notas:

  • O Eventcreatecomando funciona no Windows XP até e inclui o Windows 10, requer privilégios de administrador para funcionar
  • Defina _thresholdconforme necessário
  • Se a bateria ficar abaixo desse valor, um evento com ID 999será gerado no log de eventos do APPLICATION com a descriçãoBattery charge has dropped
  • Modifique o eventcreatecomando conforme necessário para sua situação.
  • Modifique o timeoutatraso conforme necessário para sua situação.

Exemplo de saída:

Minha bateria atualmente tem uma carga de 81%. Eu defino o limite para 82. Aqui está o que acontece quando eu corro Battery.cmd:

> battery
81
threshold reached

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

E aqui está a nova entrada no log de eventos:

insira a descrição da imagem aqui


sintaxe de criação de evento

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"

Leitura adicional

  • Um índice AZ da linha de comando do Windows CMD - uma excelente referência para todos os itens relacionados à linha de cmd do Windows.
  • eventcreate - Crie um evento personalizado no Visualizador de Eventos do Windows.
  • schtasks - Crie / edite uma tarefa / tarefa agendada. O trabalho pode ser criado no computador local ou remoto.
  • wmic - Comando da Instrumentação de Gerenciamento do Windows.
DavidPostill
fonte
Eu realmente gosto disso! No seu POV, é melhor criar eventos e executar tarefas baseadas em eventos (por exemplo, script PS)? Ou ... modifique esse script para executar meu script PS, se o nível da bateria cair 1%. Presumi que o Windows estivesse criando eventos para alteração do nível da bateria. Não pensei nessa abordagem, que poderia ser melhor.
usar o seguinte código
1
@MiHa Até você. Consoante o que for mais fácil de entender e manter :)
DavidPostill
6

Há um Microsoft-Windows-Batteryprovedor ETW com BatteryPercentRemainingevento com o ID 13. Você pode codificar um projeto que usa o TraceEvent para criar um ouvinte em tempo real para esse Microsoft-Windows-Batteryprovedor. O evento possui as entradas RemainingPercentagepara mostrar o status e PercentageChangever a alteração:

insira a descrição da imagem aqui

Quando você vir esse evento e ver a -1alteração PercentageChange, execute o programa que deseja.

magicandre1981
fonte
2

OK, o script fornecido por DavidPostill não funciona. É um ótimo script, mas o código está irregular ou desatualizado.

Aqui está o fixo:

@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

Sugeri esta edição na resposta de DavidPostill, mas não sei por que não foi aprovada ...

AneesAhmed777
fonte
Ele me colocou no caminho certo, e foi por isso que aceitei sua resposta, mas muito obrigado! para o seu script fixo.
precisa saber é o seguinte
Enquanto corrigia o código, eu percebi o quão errado e errado findstré isso ... Que pena! Seriuosly, Microsoft? Estou impressionado com o pequeno truque sujo de DavidPostill para fazer o trabalho.
precisa saber é o seguinte
0

Existe uma maneira muito mais fácil de verificar o nível da bateria. Na área de navegação, basta colocar o mouse sobre o ícone da bateria e ele dará uma porcentagem.

Gary Weinstein
fonte
Sim, mas isso é realmente o que eu queria ... Eu queria monitorar o nível de bateria automaticamente, com base no nível de bateria fazer algumas coisas (novamente automaticamente)
RiddleMeThis
Por favor, leia a pergunta novamente com atenção. Sua resposta não responde à pergunta original.
DavidPostill