Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellでWindowsのスケジュールタスクを作成・管理する方法【実践ガイド】

多くのユーザーや管理者は、Windowsでスケジュールタスクを作成・管理する際に、taskschd.mscというGUIコンソール(タスクスケジューラ)を使用しています。しかし、スクリプトや自動化フローの中でタスクを扱う場合は、PowerShellの機能を活用する方がはるかに効率的です。この記事では、PowerShellを使ってWindowsタスクスケジューラのタスクを作成・管理する方法を詳しく解説します。

PowerShellによるWindowsスケジュールタスクの管理

Windows 10 / Windows Server 2016以降では、ScheduledTasks PowerShellモジュールを使用してスケジュールタスクを管理します。モジュールに含まれるコマンドレットの一覧は、以下のコマンドで確認できます。

Get-Command -Module ScheduledTasks

  • Disable-ScheduledTask
  • Enable-ScheduledTask
  • Export-ScheduledTask
  • Get-ClusteredScheduledTask
  • Get-ScheduledTask
  • Get-ScheduledTaskInfo
  • New-ScheduledTask
  • New-ScheduledTaskAction
  • New-ScheduledTaskPrincipal
  • New-ScheduledTaskSettingsSet
  • New-ScheduledTaskTrigger
  • Register-ClusteredScheduledTask
  • Register-ScheduledTask
  • Set-ClusteredScheduledTask
  • Set-ScheduledTask
  • Start-ScheduledTask
  • Stop-ScheduledTask
  • Unregister-ClusteredScheduledTask
  • Unregister-ScheduledTask

ヒント: 以前は、Windowsに組み込まれているコンソールツール schtasks.exe を使ってスケジューラジョブの作成や管理を行うのが一般的でした。

PowerShellでスケジュールタスクを作成する

最新バージョンのPowerShell(Windows Server 2012 / Windows 8 以降の PowerShell 3.0)では、New-ScheduledTaskTrigger および Register-ScheduledTask コマンドレットを使用してスケジュールタスクを作成できます。

ここでは、システム起動時(または特定の時刻)に実行され、PowerShellスクリプトやコマンドを実行するスケジュールタスクを作成してみましょう。例として、「StartupScript1」という名前のタスクを作成します。このタスクは、毎日午前10:00にPowerShellスクリプトファイル C:\PS\StartupScript.ps1 を実行し、SYSTEMアカウントで昇格された権限(「最上位の特権で実行」オプション有効)のもとで動作します。

$Trigger= New-ScheduledTaskTrigger -At 10:00am -Daily
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\StartupScript1.ps1"
Register-ScheduledTask -TaskName "StartupScript1" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

タスクが正常に作成されると、ステータスに「準備完了(Ready)」と表示されます。

作成したPowerShellスクリプトは指定されたスケジュールに従って実行されます。なお、コンピューターのPowerShell実行ポリシーによってPS1スクリプトの実行が制限されている場合は、-Bypass パラメーターを付けてスケジュールタスクからスクリプトを実行できます。

新しいタスクを作成する際には、次のコードを使用してください。

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"

ヒント: コンピューターの起動時に毎回タスクを実行したい場合は、最初のコマンドを次のように変更します。
$Trigger= New-ScheduledTaskTrigger -AtStartup
ユーザーのログオン時にタスクを実行したい場合は、次のようにします。
$Trigger= New-ScheduledTaskTrigger -AtLogon

taskschd.msc コンソールを開き、タスクスケジューラライブラリに新しいタスクが登録されていることを確認しましょう。

なお、PowerShell 2.0環境(Windows 7 / Windows Server 2008 R2)でPowerShellからスケジュールタスクを作成するには、Schedule.Service COMインターフェースを使用するか、PowerShellのバージョンをアップデートする必要があります。以下の例では、起動時に特定のPowerShellスクリプトファイルを実行するタスクを NT AUTHORITY\SYSTEM 権限で作成しています。

$TaskName = "NewPsTask"
$TaskDescription = "Running PowerShell script from Task Scheduler"
$TaskCommand = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$TaskScript = "C:\PS\StartupScript.ps1"
$TaskArg = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject("Schedule.Service")
$service.Connect()
$rootFolder = $service.GetFolder("\")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescription"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
$trigger = $triggers.Create(8)

PowerShellでスケジュールタスクを表示・実行する方法

Windows上のすべてのアクティブなスケジュールタスクを一覧表示するには、次のコマンドを使用します。

Get-ScheduledTask -TaskPath | ? state -ne Disabled

特定のタスクに関する情報を取得するには、次のようにします。

Get-ScheduledTask CheckServiceState| Get-ScheduledTaskInfo

LastRunTime : 2021/04/07 10:00:00
LastTaskResult : 267011
NextRunTime : 2021/04/08 10:00:00
NumberOfMissedRuns : 0
TaskName : CheckServiceState
TaskPath : \
PSComputerName :

タスクを無効化するには:

Get-ScheduledTask CheckServiceState | Disable-ScheduledTask

タスクを有効化するには:

Get-ScheduledTask CheckServiceState | Enable-ScheduledTask

スケジュールを待たずにタスクを即時実行するには:

Start-ScheduledTask CheckServiceState

タスクスケジューラライブラリからタスクを完全に削除するには:

Unregister-ScheduledTask -TaskName CheckServiceState

タスクの実行ユーザーを変更したり、互換性モードなどを設定したい場合は、Set-ScheduledTask コマンドレットを使用します。

$task_user = New-ScheduledTaskPrincipal -UserId woshub\j.abrams' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings

Set-ScheduledTask: アカウント名とセキュリティ ID の間のマッピングは実行されませんでした」というエラーが発生した場合は、指定したユーザー名が正しいかどうかを確認してください。

XMLファイルを使ったスケジュールタスクのエクスポートとインポート

PowerShellでは、任意のスケジュールタスクの現在の設定をテキスト形式のXMLファイルにエクスポートできます。これにより、タスクのパラメーターを保存し、他のコンピューターへ展開することが可能になります。タスクはタスクスケジューラのGUIからも、PowerShellコンソールからもエクスポートできます。

「StartupScript」という名前のタスクを StartupScript.xml ファイルにエクスポートするコマンドは次のとおりです。

Export-ScheduledTask StartupScript | out-file c:\tmp\StartupScript.xml

Export-ScheduledTask コマンドレットはPowerShell 2.0では利用できないため、Windows 7 / Windows Server 2008 R2では、組み込みツールの schtasks を使ってタスク設定をエクスポートし、結果をテキストファイルに出力するのがおすすめです。

schtasks /query /tn "NewPsTask" /xml >> "c:\tmp\NewPsTask.xml"

スケジュールタスクの設定をXMLファイルにエクスポートした後は、GUI、SchTasks.exe、またはPowerShellを使って、ネットワーク上の任意のコンピューターにインポートできます。

Register-ScheduledTask コマンドレットを使用すると、XMLファイルからタスク設定を読み込んで登録できます。
Register-ScheduledTask -Xml (Get-Content "\\mun-fs01\public\NewPsTask.xml" | out-string) -TaskName "NewPsTask"

PowerShell 2.0環境(Windows 7 / Server 2008 R2)では、schtasksツールを使ったインポートの方が簡単です。最初のコマンドで新しいタスクを作成し、2番目のコマンドでトリガーを待たずに即時実行します。

schtasks /create /tn "NewPsTask" /xml "\\Srv1\public\NewPsTask.xml" /ru corp\skrutapal /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"

なお、この例ではタスクの実行に使用するアカウントの資格情報を指定しています。資格情報がジョブに保存されていない場合、インポート時に入力を求められますのでご注意ください。

  1. Windowsタスクスケジューラでタスクの実行を遅延させる方法【初心者向け解説】

    多くの方が、基本的なタスクやプログラムの実行にタスクスケジューラを活用したことがあるのではないでしょうか。しかし、タスクスケジューラにはそれ以外にも便利な機能があります。そのひとつが、スケジュールされたタスクの実行を遅らせる機能です。 タスクの遅延実行は非常にシンプルな操作で設定でき、特にWindowsの起動時間を短縮したい場合に役立ちます。タスクの開始を意図的に遅らせることで、PCの起動時に複数の処理が同時に走るのを防ぎ、起動にかかる時間を大幅に短くできるのです。 この記事では、Windowsのタスクスケジューラでタスクの実行を遅延させる具体的な手順を、ステップごとにわかりやすく解説します。

  2. Gmailでタスクを作成・管理する方法を徹底解説

    タスクやリマインダーの作成・管理には、従来サードパーティ製ツールがよく使われてきました。各アプリストアには数百種類ものWeb・モバイルアプリが存在し、それぞれに特徴や強みがあります。 しかし、メールクライアントという観点で見ると、タスクの作成と管理において最も優れているのはGmailです。Outlookのタスク機能やMacのApple Mailとの連携など、類似の機能は存在しますが、WebベースのプラットフォームであるGmailはそのどちらをも上回る性能を発揮します。 この記事では、Gmailのタスク機能について詳しく解説し、タスクの作成・管理・活用方法をわかりやすくご紹介します。 Gmail