Идентификатор события Windows для изменения уровня заряда батареи

9

Мне нужно создать задачу в TS на основе изменения уровня заряда батареи. Допустим, моя батарея падает с 67% до 66% . Как я могу запустить задачу на основе этого события. Windows вообще регистрирует это? Я не мог найти эту информацию нигде.

RiddleMeThis
источник
Какая версия Windows?
DavidPostill
Windows 10 (и желательно W7)
RiddleMeThis

Ответы:

11

Мне нужно создать задачу в планировщике задач на основе изменения уровня заряда батареи

Windows не регистрирует такие детали как события. Однако вы можете использовать что-то вроде командного файла ниже и создать собственное событие.


Battery.cmd

Этот пакетный файл отслеживает текущий процент заряда батареи и создает пользовательское событие, если заряд падает ниже определенного пользователем порогового значения.

@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

Ноты:

  • Команда Eventcreateработает на Windows XP до Windows 10 включительно, для работы требуются права администратора
  • Установить _thresholdкак требуется
  • Если батарея падает ниже этого значения, событие с идентификатором 999будет сгенерировано в журнале событий ПРИЛОЖЕНИЯ с описанием.Battery charge has dropped
  • Измените eventcreateкоманду в соответствии с вашей ситуацией.
  • Измените timeoutзадержку в соответствии с вашей ситуацией.

Пример вывода:

Моя батарея в настоящее время имеет заряд 81%. Я установил порог на 82. Вот что происходит, когда я бегу Battery.cmd:

> battery
81
threshold reached

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

И вот новая запись в журнале событий:

введите описание изображения здесь


синтаксис события

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"

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • eventcreate - создает пользовательское событие в средстве просмотра событий Windows.
  • schtasks - Создание / редактирование запланированного задания / задачи. Задание может быть создано на локальном или удаленном компьютере.
  • wmic - команда инструментария управления Windows.
ДэвидПостилл
источник
Мне действительно это нравится! Из вашего POV лучше создавать события и запускать задачи на основе событий (например, сценарий PS)? Или ... измените этот скрипт, чтобы он запускал мой скрипт PS, если уровень заряда батареи падает на 1%. Я предположил, что Windows создает события для изменения уровня заряда батареи. Я не думал об этом подходе, который мог бы быть лучше.
RiddleMeThis
1
@MiHa до вас. Что легче всего понять и поддерживать :)
DavidPostill
6

Существует Microsoft-Windows-Batteryпоставщик ETW с BatteryPercentRemainingсобытием с идентификатором 13. Вы можете кодировать проект, который использует TraceEvent, чтобы создать прослушиватель в реальном времени для этого Microsoft-Windows-Batteryпоставщика. Событие имеет записи, RemainingPercentageчтобы показать статус и PercentageChangeувидеть изменения:

введите описание изображения здесь

Когда вы увидите это событие и увидите -1изменения для PercentageChange, запустите нужную программу.

magicandre1981
источник
2

Хорошо, скрипт, предоставленный DavidPostill, не работает. Это хороший маленький скрипт, но код либо ошибочный, либо устаревший.

Вот фиксированный:

@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

Я предложил это изменение в ответ Дэвида Постилла, но я не знаю, почему оно не было одобрено ...

AneesAhmed777
источник
Он поставил меня на правильный путь, поэтому я принял его ответ, но большое спасибо! для вашего фиксированного сценария.
RiddleMeThis
Исправляя код, я осознал, насколько он ошибочен и ошибочен findstr... Слишком плохо! Серьезно, Microsoft? Я впечатлен грязным маленьким взломом Дэвида Постилла, чтобы сделать работу.
AneesAhmed777
0

Существует гораздо более простой способ проверить уровень заряда батареи. В области навигации просто наведите курсор мыши на значок батареи, и он выдаст процент.

Гари Вайнштейн
источник
Да, но это на самом деле не то, что я хотел ... Я хотел автоматически контролировать уровень заряда батареи и на основе уровня заряда батареи делать некоторые вещи (снова автоматически)
RiddleMeThis
Пожалуйста, внимательно прочитайте вопрос. Ваш ответ не отвечает на оригинальный вопрос.
DavidPostill