タスクスケジューラは、現在でもGUIで設定している方が多いですね。 一台や二台にやるならいいのですが、10台100台の時はどうするのかが課題です。
Linuxにはcronがあります。Windowsには、Windows XP, 2003以降schtasks.exeがat.exeに変わりあります。 末ジュールタスクはPowerShell 3.0でも操作できます。(PowerShell2.0ならPSK Moduleで)
今回は、複数台でのタスクスケジューラの自動登録、実行などの方法を紹介します。 毎回同じ操作をAutomateする。こういう身近な作業からPowerShell普及を進めていきたいものです。
GUI
GUIのスケジューラタスクは誰もが知っている画面でしょう。一応Windows Server 2008からcontrol panel直下ではなくなっているので紹介しておきます。
Windows Server 2012の場合、Server Manager &> Tools &> Task Schedulerにあります。

Windows 8の場合、Control Panel &> Administrative Tools &> Task Schedulerにあります。
PowerShellでスケジュールタスクを操作する
schtasks.exeじゃない理由? いえ、寧ろschtasks.exeである理由がないのです。
やったことがある方なら分かるでしょうが、 Windows XPとWindows 7だけでもschtasks.exeのコマンドオプション・実行挙動は変わっています。 PowerShellを使って一貫したパラメータ・挙動を維持、PowerShell Remotingで遠隔PCにも操作ができます。 これがschtasks.exeではなくPowerShellでスケジューラタスクを触りたい理由です。
PowerShell 3.0の場合
PowerShell 3.0からは標準でScheduledTaskコマンドレットがあります。
PS> Get-Command -Module ScheduledTasks CommandType Name ModuleName ----------- ---- ---------- Function Disable-ScheduledTask ScheduledTasks Function Enable-ScheduledTask ScheduledTasks Function Export-ScheduledTask ScheduledTasks Function Get-ClusteredScheduledTask ScheduledTasks Function Get-ScheduledTask ScheduledTasks Function Get-ScheduledTaskInfo ScheduledTasks Function New-ScheduledTask ScheduledTasks Function New-ScheduledTaskAction ScheduledTasks Function New-ScheduledTaskPrincipal ScheduledTasks Function New-ScheduledTaskSettingsSet ScheduledTasks Function New-ScheduledTaskTrigger ScheduledTasks Function Register-ClusteredScheduledTask ScheduledTasks Function Register-ScheduledTask ScheduledTasks Function Set-ClusteredScheduledTask ScheduledTasks Function Set-ScheduledTask ScheduledTasks Function Start-ScheduledTask ScheduledTasks Function Stop-ScheduledTask ScheduledTasks Function Unregister-ClusteredScheduledTask ScheduledTasks Function Unregister-ScheduledTask ScheduledTasks
PowerShell 2.0 の場合
PowerShell Packを入れれば利用できます。 全てだったかは記憶にありません。
http://archive.msdn.microsoft.com/PowerShellPack
タスクの取得
Get-ScheduledTaskコマンドレットで行います。 TaskNameやTaskPathでフィルタも可能です。
Get-ScheduledTask -TaskName test -TaskPath \
タスクの登録
スケジューラタスクの登録はRegister-SchedledTaskコマンドレットで行います。 なお、コマンドレットの裏で行っているのはcim操作です。
Register-ScheduledTask -TaskPath \ -TaskName test -Action $action -Trigger $trigger -Settings $settings
-TaskPathと-TaskNameは見てのとおりです。しかし、-Actionと-Triggerと-Settingは違います。
Actionは{MSFT_TaskExecAction}として、Triggerは{MSFT_TaskLogonTrigger}として、SettingsはMSFT_TaskSettings3として渡す必要があります。
この様子は、現在のスケジュラタスクを見れば分かります。
PS> Get-ScheduledTask | where taskpath -eq \ | where TaskName -eq "CLMLSvc" | select * State : Running Actions : {MSFT_TaskExecAction} Author : CyberLink Date : Description : Documentation : Principal : MSFT_TaskPrincipal2 SecurityDescriptor : D:(A;OICI;FAGAKA;;;WD) Settings : MSFT_TaskSettings3 Source : TaskName : CLMLSvc TaskPath : \ Triggers : {MSFT_TaskLogonTrigger} URI : Version : PSComputerName : CimClass : Root/Microsoft/Windows/TaskScheduler:MSFT_ScheduledTask CimInstanceProperties : {Actions, Author, Date, Description...} CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties
Actionの登録
Actionは、スケジューラタスクでいうところの操作 = 実際に行う実行内容です。exe指定はここです。 実際に何が設定可能かは、 パラメータで見てもいいですし、現在の設定から見てもいいでしょう。
PS> (Get-ScheduledTask | where taskpath -eq \ | where TaskName -eq "CLMLSvc").Actions Id : Arguments : Execute : D:\Software\Video_Player\CyberLink\Power2Go\CLMLSvc.exe WorkingDirectory : PSComputerName :
New-ScheduledTaskActionで定義します。
例えば、PowerShell.exeを起動してGet-Dateコマンドレットをログに出す操作を定義してみましょう。まずはこの操作を適当な変数に入れておきます。
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-Command 'Get-Date | Out-File D:\Test.log -Encoding default'"
Trigger の設定
Triggerはトリガー、つまり実行スケジュールです。 実際に何が設定可能かは、 パラメータで見てもいいですし、現在の設定から見てもいいでしょう。
PS> (Get-ScheduledTask | where taskpath -eq \ | where TaskName -eq "CLMLSvc").Triggers Enabled : True EndBoundary : ExecutionTimeLimit : Id : Repetition : MSFT_TaskRepetitionPattern StartBoundary : Delay : PT30S UserId : PSComputerName :
New-ScheduledTaskTriggerで定義します。今回は、毎日PM20:15に起動されます。この操作も適当な変数に入れておきます。
$trigger = New-ScheduledTaskTrigger -DaysInterval 1 -Daily -At "20:15 PM"
Settingsの定義
Settingsは、上記以外の挙動全てを設定します。 例えば、どのWindows Versionとして起動するかや、実行画面を出すかなどです。
実際に何が設定可能かは、 パラメータで見てもいいですし、現在の設定から見てもいいでしょう。
PS> (Get-ScheduledTask | where taskpath -eq \ | where TaskName -eq "CLMLSvc").Settings AllowDemandStart : True AllowHardTerminate : False Compatibility : Vista DeleteExpiredTaskAfter : DisallowStartIfOnBatteries : False Enabled : True ExecutionTimeLimit : P3D Hidden : True IdleSettings : MSFT_TaskIdleSettings MultipleInstances : IgnoreNew NetworkSettings : MSFT_TaskNetworkSettings Priority : 7 RestartCount : 0 RestartInterval : RunOnlyIfIdle : False RunOnlyIfNetworkAvailable : False StartWhenAvailable : True StopIfGoingOnBatteries : False WakeToRun : False DisallowStartOnRemoteAppSession : False UseUnifiedSchedulingEngine : False MaintenanceSettings : volatile : False PSComputerName :
New-ScheduledTaskSettingsSetで定義します。
今回は、Windows 8として起動して、起動時に実行画面を表示しないようにしましょう。
この操作も適当な変数に入れておきます。
$settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -Hidden
スケジュラータスクの登録
ここまで出来れば簡単です。
適当な名前をつけて、定義するタスクパスを指定します。 先述の通り、タスクスケジューラ直下なら\です。
Register-ScheduledTask -TaskPath \ -TaskName test -Action $action -Trigger $trigger -Settings $settings
この時、ユーザー名、パスワードを指定する場合は、直接指定もできます。
# user / Pass の場合 $user = "hoge" $pass = "fuga" Register-ScheduledTask -TaskPath \ -TaskName test -Action $action -Trigger $trigger -User $user -Password $pass
あるいは、 cimセッション経由でも可能です。 このcimセッションは、 settingsの設定定義時か、 Registerでのタスクスケジューラ定義時に可能です。
# cim session も可能 $cred = Get-Credential -UserName administrator -Message "hoge" $cim = New-CimSession -Credential $cred # cim sessionの場合 (Register との選択) $settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -Hidden -CimSession $cim # cim sesionの場合 ( SettingSet との選択) Register-ScheduledTask -TaskPath \ -TaskName test -Action $action -Trigger $trigger -Settings $settings -Force -CimSession $cim
作成した スケジューラタスクを上書きしたい
同名のスケジューラタスクが同一パスに存在すると登録できません。 上書きするには、 Register時に -Forceをします。
# -Force 付けないと 同名エラー Register-ScheduledTask -TaskPath \ -TaskName test -Action $action -Trigger $trigger -User $user -Password $pass # -Force Swtich で上書き可能 Register-ScheduledTask -TaskPath \ -TaskName test -Action $action -Trigger $trigger -Settings $settings -Force # ユーザーを指定してForce とか Register-ScheduledTask -TaskPath \ -TaskName test -Action $action -Trigger $trigger -Settings $settings -User $user -Password $pass -Force
タスクの開始/停止
開始はStart 、 停止はStopです。
# 開始 Start-ScheduledTask -TaskPath \ -TaskName test # 停止 Stop-ScheduledTask -TaskPath \ -TaskName test
タスクの無効/有効化
コレも容易です。 無効はDisable、 有効はEnableです。
# 無効 Disable-ScheduledTask -TaskPath \ -TaskName test # 有効 Enable-ScheduledTask -TaskPath \ -TaskName test
タスクの削除
スケジューラタスクの削除は? Registerの逆でUnregisterです。 削除時は、確認第ログが出ますが -Forceスイッチはありません。 バックグラウンドで暗黙に処理させる場合は、 -AsJobします。これで、ダイアログなしに削除できます。 この場合は、 Get-Jobで結果を取得できます。
# 設定の除去 (-AsJob Switch で確認なしで除去) Unregister-ScheduledTask -TaskName test Unregister-ScheduledTask -TaskName test -AsJob
まとめ
決まったスケジューラタスクの登録はPowerShellで。 そのメリットは、一度設定を定めれば人の手が入ることなく = DRYやAutomation 、ミスの低減を実現するためです。 簡単ですので、試して見てください。
CIMは上手くいかなくて結構泣きましたが、Windows 8なら問題ないんですよね。 まぁ現在の実行ユーザーなら不要なので要らないと言えば要らない?