PowerShell: лучший способ запуска скрипта при отключении питания - PullRequest
1 голос
/ 29 января 2020

, поэтому я собираю скрипт в PowerShell. Сценарий должен непрерывно копировать данные из журнала на локальном сервере в моем доме (это закодировано и работает).

У меня так, чтобы при отключении питания ИБП включался, если питание для некоторых причина исчезает / затемнение. Когда это происходит, мой код переключает режим питания в режим экономии заряда батареи, в то же время отправляя смс на мой телефон (часть смс должна быть закодирована позже), также, когда это происходит, скрипт начнет копировать журнал с сервера. в текстовый файл (работает).

Теперь к моему актуальному вопросу. Какой лучший способ запустить этот скрипт? Я думаю, что если скрипт выполняется 24/7, это может замедлить работу сервера.

Так что мне интересно, каков наилучший способ запустить скрипт? Есть ли в windows что-то, что может запустить файл программы / exe, если источник питания отключается?

Если нет, то я думаю, что al oop, который просто работает 24/7, и как только Batterystatus переходит со 2 на 1, он выходит из l oop и запускает реальный скрипт, но лучше всего это сделать на отдельный файл PowerShell? Например, отдельный файл PowerShell запускает l oop и имеет:

if ($batterystatus -eq 1){
  start "C:user\MainScript.exe"
}
Exit

Есть какие-нибудь умные идеи для кодирования этого? :)

Я сейчас на моем телефоне, поэтому не могу отправить образец кода, но я не думаю, что он нужен в любом случае хе-хе:)

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Вы можете сделать это с помощью wmi и события:

# check every 120 seconds
$poll = 120

# estimated battery charge remaining threshold
$remaining = 10

# query 
$query = "Select * from __InstanceModificationEvent within $poll where TargetInstance ISA 'Win32_Battery' AND TargetInstance.EstimatedChargeRemaining<=$remaining"


# what to do when the event occurs
$action={
    Start-Process -FilePath "C:user\MainScript.exe"
}

Register-WmiEvent -Query $query -SourceIdentifier "Battery Monitor" -Action $action

# check event with
# Get-EventSubscriber -SourceIdentifier "Battery Monitor" 

# unregister event with
# Get-EventSubscriber -SourceIdentifier "Battery Monitor" | Unregister-Event
1 голос
/ 29 января 2020

Согласно Использование Windows PowerShell для определения, работает ли ноутбук от батареи Вы можете создать скрипт, который проверяет, работает ли устройство от батареи (C: \ User \ Check-PowerStateAndCopyIfOnBattery .ps1):

    #Check-PowerStateAndCopyIfOnBattery.ps1
    if ((Get-WmiObject -Class BatteryStatus -Namespace root\wmi).PowerOnLine -eq $false)
      {
        while((Get-WmiObject -Class BatteryStatus -Namespace root\wmi).PowerOnLine -eq $false)
          {
            Start-Process "C:\User\MainScript.exe" -Wait
          }
      }

И затем создайте запланированное задание, которое запускается при изменении состояния питания (System EventID 105). Вы можете сохранить xml ниже как Check-PowerStateAndCopyIfOnBattery. xml и импортировать его (см .: Как импортировать запланированное задание из файла XML? ).

    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
      <Triggers>
        <EventTrigger>
          <Enabled>true</Enabled>
          <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="System"&gt;&lt;Select Path="System"&gt;*[System[Provider[@Name='Microsoft-Windows-Kernel-Power'] and EventID=105]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
        </EventTrigger>
      </Triggers>
      <Settings>
        <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
        <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
        <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
        <AllowHardTerminate>true</AllowHardTerminate>
        <StartWhenAvailable>true</StartWhenAvailable>
        <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
        <IdleSettings>
          <StopOnIdleEnd>false</StopOnIdleEnd>
          <RestartOnIdle>false</RestartOnIdle>
        </IdleSettings>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <Enabled>true</Enabled>
        <Hidden>false</Hidden>
        <RunOnlyIfIdle>false</RunOnlyIfIdle>
        <WakeToRun>false</WakeToRun>
        <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
        <Priority>7</Priority>
      </Settings>
      <Actions Context="Author">
        <Exec>
          <Command>Powershell.exe</Command>
          <Arguments>-ExecutionPolicy Bypass C:\User\Check-PowerStateAndCopyIfOnBattery.ps1 -RunType $true -Path C:\User\</Arguments>
          <WorkingDirectory>C:\User\</WorkingDirectory>
        </Exec>
      </Actions>
    </Task>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...