自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

タスクスケジューラのxmlをコマンドで直接編集してバッテリーモードでも実行させる

バッチファイルで自分自身をタスクスケジューラに登録して再起動後も実行させようと思っても「コンピューターを AC電源で使用している場合のみタスクを開始する(P)」という項目がONの場合はノートPCが電源に接続されていない状態だとタスクを実行してくれない。

しかし、タスクスケジューラを操作できる schtasks コマンドで変更可能な項目は限られており、この項目もコマンドでは変更不可能なためどうしたものかと調べていたらxmlを直接操作することで変更できたのでご紹介。


バッテリー駆動でもタスクを実行させる関数

function disableOnlyRunAc-Task($taskName){
    $taskXml = [xml](schtasks /query /tn $taskName /xml)
    $taskXml.Task.Settings.DisallowStartIfOnBatteries = "false"
    $taskXml.Save("C:\tempTask.xml")
    schtasks /delete /tn $taskName /f
    schtasks /create /tn $taskName /xml "C:\tempTask.xml"
    Remove-Item "C:\tempTask.xml"
}

# コンピューターをAC電源で使用している場合のみタスクを開始するを無効化
disableOnlyRunAc-Task "<タスク名>"

※管理者権限での実行が必要

※xmlの操作を楽にするためにPowerShellを使用

DisallowStartIfOnBatteries という項目が コンピューターをAC電源で使用している場合のみタスクを開始する にあたるので、ここを false に変更して作り直すことで無効化できるということです。

f:id:maru0014:20200912123732p:plain
コンピューターをAC電源で使用している場合のみタスクを開始する

 

batファイルで利用する場合

disableOnlyRunAc-Task.ps1 として保存する

Param(
    [string]$taskName
)

$taskXml = [xml](schtasks /query /tn $taskName /xml)
$taskXml.Task.Settings.DisallowStartIfOnBatteries = "false"
$taskXml.Save("C:\tempTask.xml")
schtasks /delete /tn $taskName /f
schtasks /create /tn $taskName /xml "C:\tempTask.xml"
Remove-Item "C:\tempTask.xml"

コマンドプロンプトから実行してみる

powershell -executionpolicy bypass .\disableOnlyRunAc-Task.ps1 -taskName "<タスク名>"

実行結果

f:id:maru0014:20200912123808p:plain

 

参考になったページ

docs.microsoft.com

blog.livedoor.jp

microsoftou.com

bgt-48.blogspot.com