Identyfikator zdarzenia Windows dla zmiany poziomu baterii

9

Muszę utworzyć zadanie w TS na podstawie zmiany poziomu baterii. Powiedzmy, że moja bateria spada z 67% do 66% . Jak mogę uruchomić zadanie na podstawie tego zdarzenia? Czy system Windows w ogóle to rejestruje? Nigdzie nie mogłem znaleźć tych informacji.

RiddleMeThis
źródło
Która wersja systemu Windows?
DavidPostill
Windows 10 (a najlepiej także W7)
RiddleMeThis

Odpowiedzi:

11

Muszę utworzyć zadanie w Harmonogramie zadań na podstawie zmiany poziomu baterii

Windows nie rejestruje tego rodzaju szczegółów jako zdarzeń. Możesz jednak użyć czegoś takiego jak plik wsadowy poniżej i utworzyć niestandardowe zdarzenie.


Battery.cmd

Ten plik wsadowy monitoruje bieżące procentowe naładowanie akumulatora i tworzy zdarzenie zdefiniowane przez użytkownika, jeśli ładunek spadnie poniżej zdefiniowanej przez użytkownika wartości progowej.

@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

Uwagi:

  • Na Eventcreatepolecenie działa w systemie Windows XP włącznie systemie Windows 10, nie wymaga uprawnień administratora do pracy
  • Ustaw _thresholdzgodnie z wymaganiami
  • Jeśli bateria spadnie poniżej tej wartości, 999w dzienniku zdarzeń APLIKACJI z opisem zostanie wygenerowane zdarzenie o identyfikatorzeBattery charge has dropped
  • Zmodyfikuj eventcreatepolecenie zgodnie z potrzebami.
  • Zmodyfikuj timeoutopóźnienie zgodnie z potrzebami.

Przykładowe dane wyjściowe:

Moja bateria ma obecnie ładunek 81%. Ustawiłem próg na 82. Oto, co się stanie, gdy uruchomię Battery.cmd:

> battery
81
threshold reached

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

A oto nowy wpis w Dzienniku zdarzeń:

wprowadź opis zdjęcia tutaj


składnia 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"

Dalsza lektura

  • Indeks AZ wiersza polecenia systemu Windows CMD - doskonałe odniesienie do wszystkich rzeczy związanych z wierszem cmd systemu Windows.
  • eventcreate - Utwórz niestandardowe zdarzenie w Podglądzie zdarzeń systemu Windows.
  • schtasks - Utwórz / edytuj zaplanowane zadanie / zadanie. Zadanie można utworzyć na komputerze lokalnym lub zdalnym.
  • wmic - polecenie Instrumentacji zarządzania Windows.
DavidPostill
źródło
Naprawdę to lubię! Z poziomu POV lepiej jest tworzyć zdarzenia i uruchamiać zadania oparte na zdarzeniach (np. Skrypt PS)? Lub ... zmodyfikuj ten skrypt, aby uruchomić mój skrypt PS, jeśli poziom naładowania baterii spadnie o 1%. Zakładałem, że Windows tworzy zdarzenia dla zmiany poziomu baterii. Nie myślałem o tym podejściu, które może być lepsze.
RiddleMeThis
1
@ MiHa Do ciebie. Cokolwiek jest najłatwiejsze do zrozumienia i utrzymania :)
DavidPostill
6

Istnieje Microsoft-Windows-Batterydostawca ETW ze BatteryPercentRemainingzdarzeniem o identyfikatorze 13. Możesz zakodować projekt, który używa TraceEvent, aby utworzyć detektor w czasie rzeczywistym dla tego Microsoft-Windows-Batterydostawcy. W zdarzeniu znajdują się wpisy RemainingPercentagepokazujące status i PercentageChangezmianę:

wprowadź opis zdjęcia tutaj

Gdy zobaczysz to zdarzenie i zobaczysz -1zmianę dla PercentageChange, uruchom odpowiedni program.

magicandre1981
źródło
2

OK, skrypt dostarczony przez DavidPostill nie działa. Jest to ładny mały skrypt, ale kod jest albo nieregularny, albo nieaktualny.

Oto ustalony:

@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

Zasugerowałem tę zmianę w odpowiedzi DavidPostill, ale nie wiem, dlaczego nie została zatwierdzona ...

AneesAhmed777
źródło
Postawił mnie na dobrej drodze, dlatego zaakceptowałem jego odpowiedź, ale bardzo dziękuję! dla ustalonego skryptu.
RiddleMeTis
Naprawiając kod, zdałem sobie sprawę, jak błędne i błędne findstrjest ... O wiele za źle! Seriuosly, Microsoft? Jestem pod wrażeniem brudnego, małego hacka Davida Postilla, aby wykonać zadanie.
AneesAhmed777
0

Jest o wiele łatwiejszy sposób sprawdzenia poziomu naładowania baterii. W obszarze nawigacji po prostu najedź myszką na ikonę baterii, a wyświetli się procent.

Gary Weinstein
źródło
Tak, ale to naprawdę nie to, czego chciałem ... Chciałem automatycznie monitorować poziom naładowania baterii i na podstawie poziomu baterii zrobić coś (ponownie automatycznie)
RiddleMeThis
Przeczytaj uważnie pytanie ponownie. Twoja odpowiedź nie odpowiada na pierwotne pytanie.
DavidPostill