用于检查电池状态变量并在 if 语句中使用它的脚本,是否有任何脚本可以每分钟将 .bat 文件 运行 作为隐藏进程

Script to check battery status variable and use it in if statement, and is there any script to make .bat file run as a hidden process every minute

目前,我正在尝试创建一个脚本文件,如果它检测到笔记本电脑 运行正在使用电池而不是交流电,它将启动其他程序。

前提是我用的是Windows8.1.

我创建了一个 .bat 文件并输入了以下脚本:

@ECHO OFF
REM To Check the battery status, providing that 2 is connected to the AC
WMIC Path Win32_Battery Get BatteryStatus 
REM Check the content of battery status variable
IF NOT "%BatteryStatus%"=="2"(
echo laptop started to use its battery )

当我 运行 上面的批处理文件时,它好像没有检测到 BatteryStatus 变量的内容。

谁能指导我找到将电池状态输出到电池状态变量的最佳方法?

另一件事,我需要一个脚本来允许这个蝙蝠 运行 并且每分钟检查一次电池,我该如何实现?

我尝试使用任务调度程序来完成,但问题是最大重现时间为 5 分钟。

有什么想法吗?

提前致谢!

更健壮一点,检查变量是否真的batterystatus:

    for /F "delims== tokens=1,2" %%a in ('WMIC Path Win32_Battery Get BatteryStatus /format:textvaluelist.xsl') do @if "%%a"=="BatteryStatus" call :DoStuff %%b
    goto :EOF

:DoStuff
    do_thing1  >nul
    do_thing2 >nul
    do_thing3 >nul
    goto :EOF

然后,使用循环继续这个过程:

:LOOP
for /f .....

timeout /t 60

goto :LOOP

好的,这就是我在 :

中的意思
@ECHO OFF
:LOOP
REM To Check the battery status, providing that 2 is connected to the AC
FOR /F "skip=1 tokens=1" %%A IN ('WMIC Path Win32_Battery Get BatteryStatus 2^>^&1') DO SET BatteryStatus=%%A
SET /A BatteryStatus+=0
REM Check the content of battery status variable
IF %BatteryStatus% EQU 2 (
ECHO laptop is running on AC power
) ELSE IF %BatteryStatus% GEQ 1 (
ECHO laptop started to use its battery
) ELSE ECHO unknown battery status
TIMEOUT /T 60 /NOBREAK > nul
GOTO :LOOP

这也具有此 中提到的循环。

我将 2>&1 部分添加到 WMIC 命令以重定向潜在的错误消息,因为它可能 return 像 No Instance(s) Available. 这样的消息。 紧随其后的附加 SET /A 命令可确保变量 %BatteryStatus% 永远不会为空,即使出现上述错误也是如此。还有额外的检查来区分电池上的 运行、交流电源上的 运行 和未知状态下的 运行(前者 IF NOT "%BatteryStatus%"=="2" 可能会在出错时产生误导)。

这就是我如何让它满足我的需求:

@ECHO OFF
:LOOP
REM To Check the battery status, providing that 2 is connected to the AC
for /F "delims== tokens=1,2" %%a in ('WMIC Path Win32_Battery Get BatteryStatus /format:textvaluelist.xsl') do @if "BatteryStatus"=="%%a" call :DoStaff "%%b"
:DoStaff
if  %~1 NEQ 2 (
ECHO laptop started to use its battery
) 
TIMEOUT /T 60 /NOBREAK > nul
GOTO :LOOP

我希望我能以某种方式隐藏批处理框,但无论如何,谢谢大家的帮助, 非常感谢!

亲切的问候

将此作为对问题的一小部分的潜在答案。您可以通过在 batch:

中添加 powershell 行来隐藏 window
powershell -window hidden -command ""

请注意,您仍会在启动时看到初始 cmd window 闪烁,但它会立即消失并在后台继续 运行。