CODE:LIFE

batPowerShell

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

avatar

バッチファイルで自分自身をタスクスケジューラに登録して再起動後も実行させようと思っても「コンピューターを 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 に変更して作り直すことで無効化できるということです。

An image from Notion

 

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 "<タスク名>"

実行結果

An image from Notion

 

参考サイト

schtasks | Microsoft Docs

https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/schtasks

タスクスケジューラのGUIでしか操作できないオプションをコマンドプロンプトだけで操作するには

http://blog.livedoor.jp/sce_info3-craft/archives/9603672.html

PowershellでXMLを読み込む

https://microsoftou.com/load-xml-with-ps/

PowerShellでXMLを編集・保存するよ! | XmlDocument

https://bgt-48.blogspot.com/2018/02/powershellxml-xmldocument.html