バッチファイルを作成してから、バッチファイルを実行するためのスケジュールされたタスクを作成するVBScriptを作成しようとしています。これまでのところ、私が試したすべてのことでバッチファイルが作成されますが、スケジュールされたタスクは作成されず、エラーも発生しません。これが私がこれまでに持っているものです:
Option Explicit
Dim objFSO, outFile, wShell
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set outFile = objFSO.CreateTextFile("C:\test.bat", True)
outFile.WriteLine "Start www.google.com"
outFile.Close
Set wShell = CreateObject ("Wscript.Shell")
wShell.Run "cmd SchTasks /Create /SC WEEKLY /D MON,TUE,WED,THU,FRI /TN 'Test Task' /TR 'C:\test.bat' /ST 16:30", 0
""Test Task""
と""C:\test.bat""
を試しましたが、同じ結果が得られました。しかし、コマンドプロンプトで次のコマンドを実行すると:
SchTasks /Create /SC WEEKLY /D MON,TUE,WED,THU,FRI /TN "Test Task" /TR "C:\test.bat" /ST 16:30
タスクは正常に作成されます。
私がこれを試したもう1つの方法は、2つのバッチファイルを作成することでした。1つはWebページを開くためのバッチファイルで、もう1つはスケジュールされたタスクを作成するためのバッチファイルです。次に、最後にtask.bat
ファイルを実行して終了しました。これが私がこれのために持っていたものです:
Option Explicit
Dim objFSO, outFile, wShell
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set outFile = objFSO.CreateTextFile("C:\test.bat", True)
outFile.WriteLine "Start www.google.com"
outFile.Close
Set outFile = objFSO.CreateTextFile("C:\task.bat", True)
outFile.WriteLine "SchTasks /Create /SC WEEKLY /D MON,TUE,WED,THU,FRI /TN ""Test Task"" /TR ""C:\test.bat"" /ST 16:30"
Set wShell = CreateObject ("Wscript.Shell")
wShell.Run "cmd start ""C:\task.bat"""
これによりバッチファイルが作成されましたが、最後にcmd
を開いただけで、その後は何もしませんでした。
私の推測では、問題はwShell.Run
の部分にあると思いますが、問題がどこにあるのかを知るのに十分な経験がありません。
ここからどこに行けばいいのかわからないので、どんな提案でも素晴らしいでしょう。
cmd
は必要ありません。 Schtasks
はそれ自体の実行可能ファイルであり、cmd
内のコマンドではありません。また、引用符で囲まれたパラメータには、2つの引用符を使用してください。
例えば:
wShell.Run "SchTasks /Create /SC WEEKLY /D MON,TUE,WED,THU,FRI /TN ""Test Task"" /TR ""C:\test.bat"" /ST 16:30", 0
VBScriptとして、コマンドで実行できることは何でも実行できます。
ルートフォルダにスケジュールされたタスクを一覧表示する方法は次のとおりです。
Set TS = CreateObject("Schedule.Service")
TS.Connect("Serenity")
Set rootFolder = TS.GetFolder("\")
Set tasks = rootFolder.GetTasks(0)
If tasks.Count = 0 Then
Wscript.Echo "No tasks are registered."
Else
WScript.Echo "Number of tasks registered: " & tasks.Count
For Each Task In Tasks
A=Task.Name
A = A & " " & Task.NextRunTime
A = A & " " & Task.LastTaskResult
wscript.echo A
Next
End If
これは ドキュメント からのもので、タスクの作成方法を示しています。
タイムトリガーの例(スクリプト)
このスクリプトの例は、特定の時間にメモ帳を実行するタスクを作成する方法を示しています。タスクには、タスクをアクティブ化するための開始境界、メモ帳を実行する実行可能アクション、およびタスクを非アクティブ化する終了境界を指定する時間ベースのトリガーが含まれています。
次の手順では、特定の時間に実行可能ファイルを開始するようにタスクをスケジュールする方法について説明します。
メモ帳を特定の時間に開始するようにスケジュールするには
TaskServiceオブジェクトを作成します。このオブジェクトを使用すると、指定したフォルダーにタスクを作成できます。
タスクフォルダを取得して、タスクを作成します。
TaskService.GetFolder
メソッドを使用してタスクが保存されているフォルダーを取得し、TaskService.NewTask
メソッドを使用してタスクを表すTaskDefinitionオブジェクトを作成します。TaskDefinition
オブジェクトを使用してタスクに関する情報を定義します。TaskDefinition.Settings
プロパティを使用して、タスクスケジューラサービスがタスクを実行する方法を決定する設定を定義し、TaskDefinition.RegistrationInfo
プロパティを使用して、タスクを説明する情報を定義します。TaskDefinition.Triggers
プロパティを使用して時間ベースのトリガーを作成します。このプロパティは、TriggerCollection
オブジェクトへのアクセスを提供します。TriggerCollection.Create
メソッド(作成するトリガーのタイプを指定)を使用して、時間ベースのトリガーを作成します。トリガーを作成するときに、トリガーの開始境界と終了境界を設定して、トリガーをアクティブまたは非アクティブにします。開始境界は、タスクのアクションがいつ実行されるかを指定します。TaskDefinition.Actions
プロパティを使用して、タスクが実行するアクションを作成します。このプロパティは、ActionCollection
オブジェクトへのアクセスを提供します。ActionCollection.Create
メソッドを使用して、作成するアクションのタイプを指定します。この例では、コマンドライン操作を実行するアクションを表すExecAction
オブジェクトを使用しています。TaskFolder.RegisterTaskDefinition
メソッドを使用してタスクを登録します。この例では、タスクは現在の時刻に30秒を加えた時間にメモ帳を開始します。次のVBScriptの例は、タスクが登録されてから30秒後にメモ帳を実行するようにタスクをスケジュールする方法を示しています。
' This sample schedules a task to start notepad.exe 30 seconds ' from the time the task is registered. '------------------------------------------------------------------ ' A constant that specifies a time-based trigger. const TriggerTypeTime = 1 ' A constant that specifies an executable action. const ActionTypeExec = 0 '******************************************************** ' Create the TaskService object. Set service = CreateObject("Schedule.Service") call service.Connect() '******************************************************** ' Get a folder to create a task definition in. Dim rootFolder Set rootFolder = service.GetFolder("\") ' The taskDefinition variable is the TaskDefinition object. Dim taskDefinition ' The flags parameter is 0 because it is not supported. Set taskDefinition = service.NewTask(0) '******************************************************** ' Define information about the task. ' Set the registration info for the task by ' creating the RegistrationInfo object. Dim regInfo Set regInfo = taskDefinition.RegistrationInfo regInfo.Description = "Start notepad at a certain time" regInfo.Author = "Administrator" ' Set the task setting info for the Task Scheduler by ' creating a TaskSettings object. Dim settings Set settings = taskDefinition.Settings settings.Enabled = True settings.StartWhenAvailable = True settings.Hidden = False '******************************************************** ' Create a time-based trigger. Dim triggers Set triggers = taskDefinition.Triggers Dim trigger Set trigger = triggers.Create(TriggerTypeTime) ' Trigger variables that define when the trigger is active. Dim startTime, endTime Dim time time = DateAdd("s", 30, Now) 'start time = 30 seconds from now startTime = XmlTime(time) time = DateAdd("n", 5, Now) 'end time = 5 minutes from now endTime = XmlTime(time) WScript.Echo "startTime :" & startTime WScript.Echo "endTime :" & endTime trigger.StartBoundary = startTime trigger.EndBoundary = endTime trigger.ExecutionTimeLimit = "PT5M" 'Five minutes trigger.Id = "TimeTriggerId" trigger.Enabled = True '*********************************************************** ' Create the action for the task to execute. ' Add an action to the task to run notepad.exe. Dim Action Set Action = taskDefinition.Actions.Create( ActionTypeExec ) Action.Path = "C:\Windows\System32\notepad.exe" WScript.Echo "Task definition created. About to submit the task..." '*********************************************************** ' Register (create) the task. call rootFolder.RegisterTaskDefinition( _ "Test TimeTrigger", taskDefinition, 6, , , 3) WScript.Echo "Task submitted." '------------------------------------------------------------------ ' Used to get the time for the trigger ' startBoundary and endBoundary. ' Return the time in the correct format: ' YYYY-MM-DDTHH:MM:SS. '------------------------------------------------------------------ Function XmlTime(t) Dim cSecond, cMinute, CHour, cDay, cMonth, cYear Dim tTime, tDate cSecond = "0" & Second(t) cMinute = "0" & Minute(t) cHour = "0" & Hour(t) cDay = "0" & Day(t) cMonth = "0" & Month(t) cYear = Year(t) tTime = Right(cHour, 2) & ":" & Right(cMinute, 2) & _ ":" & Right(cSecond, 2) tDate = cYear & "-" & Right(cMonth, 2) & "-" & Right(cDay, 2) XmlTime = tDate & "T" & tTime End Function
スクリプトでは、コマンドで一重引用符を使用しましたが、CMDでのテストでは、二重引用符を使用しました。実行しても機能しますか..?:
SchTasks /Create /SC WEEKLY /D MON,TUE,WED,THU,FRI /TN 'Test Task' /TR 'C:\test.bat' /ST 16:30
そうでない場合は、二重引用符で試して、2倍にしてエスケープします。
wShell.Run "SchTasks /Create /SC WEEKLY /D MON,TUE,WED,THU,FRI /TN ""Test Task"" /TR ""C:\test.bat"" /ST 16:30", 0