【4】VBSでタスクを上書き登録する(Xmlファイル使用版)

VBSでタスクを上書き登録する(Xmlファイル使用版)

適度な休憩で高い集中力を作る。これを習慣化するには意思の力だけでは難しいところもあります。仕組みを作って休憩時間を強制してるので、その仕組を紹介していきます。今回はVBSでタスクを上書きする仕組みを使います。この仕組では前回準備したひな形Xmlファイルを利用します。

引き続き、Outlookの予定表に沿ってPCをロックする仕組みをつくっていきたいとおもいます。

前回は 休憩時間にパソコンをロックするタスクのひな形ファイルを準備するところまで進めました。

今回は、準備したひな形のxmlファイルをタスクスケジューラーへ登録する仕組みを作ります。

実行時間の更新とタスク登録コード全文

Option Explicit

Dim nextBreakTime

' 引数の数を確認
if WScript.Arguments.Count = 2 Then
	nextBreakTime = WScript.Arguments(0)
Else
	WScript.Quit()
End if

' 登録用XMLファイルの更新

' カレントディレクトリを取得
Dim Fso

Set Fso = CreateObject("Scripting.FileSystemObject")

Dim str,obj,currentDirectory
str = WScript.ScriptFullName
Set obj = Fso.GetFile( str )
Set obj = obj.ParentFolder
currentDirectory = obj.Path

Dim filePath

' ファイルパス作成
filePath = currentDirectory & "\" & "BreakTimeSchedule.xml"

' 登録用ファイルの更新
setTaskStartBoundary filePath, nextBreakTime

' タスクの登録
setTask filePath ,"BreakTimeSchedule"

' 登録用のXMLファイルを更新する
sub setTaskStartBoundary(ByVal xmlFilePath,ByVal timeStr)

	' XMLファイルの書き換え
	Dim objXML,filePath,startBoundary

	Set objXML = CreateObject("Msxml2.DOMDocument.3.0")

	' XML を読み込み
	objXML.load(xmlFilePath)

	' XMLファイル内容の変更

	dim objList, objNode

	Set objList = objXml.SelectNodes("//Task/Triggers/TimeTrigger/StartBoundary")
	for each objNode in objList
		objNode.text = timeStr
	next

	' XML を保存
	objXML.save(xmlFilePath)
	
	set objXML = Nothing

End sub

' タスクスケジューラへタスクを登録する
sub setTask(ByVal xmlFilePath ,ByVal taskName)

	' タスクの登録処理
	Dim wsShell, wsExec,Cmd

	Set wsShell = CreateObject("WScript.Shell")

	Cmd = "schtasks /create /f /xml " & xmlFilePath & " /tn " & taskName
	
	wsShell.run Cmd,0

End sub

ここでは上記を「scdlSetBreakTimeSchedule.vbs」として保存します。

関数について

以下、関数について補足していきます。

ひな型のxmlファイルの実行時間を更新する関数

xmlファイル内での項目をノードと呼びます。ノードは入れ子構造になっていて構造は基本的に変わりません。

更新が必要な項目は開始日時1つだけなので、目的のノードまでの階層を直接書いて処理をしています。

' 登録用のXMLファイルを更新する
sub setTaskStartBoundary(ByVal xmlFilePath,ByVal timeStr)

	' XMLファイルの書き換え
	Dim objXML,filePath,startBoundary

	Set objXML = CreateObject("Msxml2.DOMDocument.3.0")

	' XML を読み込み
	objXML.load(xmlFilePath)

	' XMLファイル内容の変更

	dim objList, objNode

	Set objList = objXml.SelectNodes("//Task/Triggers/TimeTrigger/StartBoundary")
	for each objNode in objList
		objNode.text = timeStr
	next

	' XML を保存
	objXML.save(xmlFilePath)
	
	set objXML = Nothing

End sub

引数について

  • xmlFilePath
    ひな形xmlのファイルパスを指定します。
  • timeStr
    タスクの開始時間を指定します。
    形式は「yyyy-mm-ddTy:nn:ss」です。

ひな形xmlファイルを使ってタスクを登録する関数

タスクの登録・更新にはschtasksコマンドを使います。

タスク登録後は実行時間が更新できればいいので、schtasksコマンドの「/change」オプションが使えそうですが、このオプションではタスク更新時にWindowsへのログインパスワードの入力を求められます。

休憩の回数分入力操作が増えるのは、正直面倒です。

そこで更新には「/create」オプションを使い、タスクの上書きを強制することで対応します。こちらはパスワード入力を求められません。

' タスクスケジューラへタスクを登録する
sub setTask(ByVal xmlFilePath ,ByVal taskName)

	' タスクの登録処理
	Dim wsShell, wsExec,Cmd

	Set wsShell = CreateObject("WScript.Shell")

	Cmd = "schtasks /create /f /xml " & xmlFilePath & " /tn " & taskName
	
	wsShell.run Cmd,0

End sub

引数について

  • xmlFilePath
    登録するxmlファイルパス
  • taskName
    タスクスケジューラーに登録するときの名前

今回はここまで。次回に続きます。

今回の仕組み必要なステップは下記になります。


この断片があなたの星へ続く道を、少しでも照らすことを願って


<参考>

投稿者: 0.1

厚塗りで「存在感や重さ、質感による説得力」のあるイラストを目指しています。 日本では線画をベースとしたイラストが主流ですが、そこから外れたモノもイラストの世界を広げる為に必要だと考えています。「世界観にもう一味試したい」そんなときには、ぜひお声がけください。

COMMENT