Windows事件ID,用于更改电池电量


9

我需要根据电池电量变化在TS中创建任务。假设我的电池电量从67%下降到66%。如何基于此事件运行任务。Windows是否完全记录了此日志?我在任何地方都找不到此信息。


哪个版本的Windows?
DavidPostill

Windows 10(最好还有W7)
RiddleMeThis

Answers:


11

我需要根据电池电量变化在任务计划程序中创建任务

Windows不会将此类详细信息记录为事件。但是,您可以使用下面的批处理文件之类的内容并创建自定义事件。


电池.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则将在APPLICATION事件日志中生成一个ID为ID 的事件,其描述为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语法

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"

进一步阅读

  • Windows CMD命令行的AZ索引 -Windows cmd行相关的所有内容的出色参考。
  • eventcreate-在Windows事件查看器中创建自定义事件。
  • schtasks-创建/编辑计划的作业/任务。可以在本地或远程计算机上创建作业。
  • wmic -Windows管理规范命令。

我真的很喜欢这个!从您的POV中,最好创建事件并运行基于事件的任务(例如PS脚本)?或者...如果电池电量下降1%,请修改此脚本以运行我的PS脚本。我以为Windows正在创建电池电量变化事件。我没有考虑过这种方法,可能会更好。
RiddleMeThis'1

1
@MiHa取决于您。哪个最容易理解和维护:)
DavidPostill


6

有一个事件ID为13 的Microsoft-Windows-BatteryETW提供程序BatteryPercentRemaining。您可以编写一个使用TraceEvent为该提供程序创建实时侦听器的项目Microsoft-Windows-Battery。该事件具有RemainingPercentage显示状态和PercentageChange查看更改的条目:

在此处输入图片说明

当您看到此事件并看到的-1更改时PercentageChange,请运行所需的程序。


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

我建议将此编辑纳入DavidPostill的答案中,但我不知道为什么它未被批准...


他使我走上了正确的道路,这就是为什么我接受他的回答,但非常感谢!为您的固定脚本。
RiddleMeThis

在修改代码时,我意识到这findstr是多么的错误和错误……太糟糕了!不好意思,微软?DavidPostill肮脏的小技巧让我印象深刻,以完成工作。
AneesAhmed777'1

0

有一种更简单的方法来检查电池电量。在导航区域中,将鼠标放在电池图标上,它将给出一个百分比。


是的,但是那真的不是我想要的...我想自动监视电池电量,并根据电池电量自动执行一些操作
RiddleMeThis

请仔细阅读问题。您的答案没有回答原始问题。
DavidPostill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.