以下の内容はhttps://tech.guitarrapc.com/entry/2013/09/03/200909より取得しました。


PowerShellでタスクスケジューラ(SchedulerTask)を操作する

タスクスケジューラは、現在でも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にあります。

f:id:guitarrapc_tech:20190125041234p:plain

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なら問題ないんですよね。 まぁ現在の実行ユーザーなら不要なので要らないと言えば要らない?




以上の内容はhttps://tech.guitarrapc.com/entry/2013/09/03/200909より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14