1

В настоящее время я пытаюсь создать файл сценария, который запустит другие программы, если он обнаруживает, что ноутбук работает, используя его аккумулятор, а не AC.Сценарий, чтобы проверить переменную состояния батареи и использовать ее в инструкции if, и есть ли какой-либо скрипт, чтобы файл .bat запускался как скрытый процесс каждую минуту.

Обеспечение использования Windows 8.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 переменной.

Может ли кто-нибудь направить меня на лучший способ получить выход batterystatus в переменную состояния батареи?

Другое дело, мне нужен сценарий, позволяющий этой летучей мыши работать и проверять эту батарею каждую минуту, как я могу это достичь?

Я попытался сделать это, используя планировщик задач, но проблема в том, что максимальное время повторения составляет 5 минут.

Любая идея?

Заранее благодарен!

+1

Заменить 'WMIC Path Win32_Battery Get BatteryStatus' на' for/F 'skip = 1 tokens = 1 "%% A в (' Путь WMIC Win32_Battery Get BatteryStatus ') установить BatteryStatus = %% A', потому что' WMIC' делает _not_ задает переменную ... – aschipfl

+1

Используйте ping localhost -n 60> nul' или 'timeout/t 60/nobreak', чтобы приостановить программу на 60 секунд, после чего используйте' goto' для создания цикла с помощью код, который вы хотите запускать каждые 1 минуту. – UnknownOctopus

ответ

1

Чуть более надежной, убедитесь, что переменная действительно 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 
+0

Вау, я никогда не слышал о «тайм-ауте» раньше - спасибо за это! – joeking

+1

Нет проблем, и для того, чтобы быть официальным здесь, синтаксис должен быть «timeout/t 60». Также можно добавить '/ nobreak', чтобы предотвратить отмену нажатия клавиши, и'> nul' можно было добавить в конец, чтобы предотвратить вывод на консоль – UnknownOctopus

+0

Спасибо за ваш ответ, но я как добавить несколько процессов для запуска, если состояние батареи не равно 2, я имею в виду не только команду echo, которую я хочу выполнить, если состояние батареи - это что-то кроме 2, у меня есть другой такие команды, как запуск других программ .. но не только эхо, можете ли вы помочь в этом? – L22222

2

Хорошо, это то, что я имел в виду в моем comment above:

@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 

Это также показывает петлю, как указано с помощью этой comment.

Я добавил участок 2>&1 в команду WMIC, чтобы перенаправить потенциальные сообщения об ошибках, так как он может вернуть сообщение, например No Instance(s) Available.. Команда SET /A сразу после этого гарантирует, что переменная %BatteryStatus% никогда не будет пуста даже в случае указанных ошибок. Существуют дополнительные проверки, чтобы отличать работу от батареи, работу от сети переменного тока и работу в неизвестном состоянии (прежний IF NOT "%BatteryStatus%"=="2" может вводить в заблуждение в случае ошибок).

0

Это, как я заставить его работать с моими потребностями:

@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 

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

С наилучшими пожеланиями

0

Бросив это в качестве потенциального ответа на незначительную часть вопроса.Вы можете скрыть окно, добавив powershell строку в ваших batch:

powershell -window hidden -command "" 

Обратите внимание, что вы будете видеть начальное окно вспышки ЦМД при запуске, но он сразу же исчезнет, ​​и продолжать работать в фоновом режиме.