PowerShell を使用してスケジュールされたタスクを自動化する方法

ええ、通常のGUIでスケジュールタスクを管理するのは、必ずしも最速で柔軟な方法とは言えません。特に、自動化したり、設定を素早く調整したりしたい場合はなおさらです。それに加えて、Windowsのグラフィカルインターフェースは時に本当に面倒です。cronのようなトリガー、権限、アクションを編集しようとすると、必ずしも分かりにくく、うまく動作しないこともあります。そこで、PowerShellは優れた代替手段です。より高度な制御とスクリプト機能を提供します。使い慣れていないと最初は少し違和感があるかもしれませんが、コマンドの使い方に慣れてしまえば、特にサーバー上や複数のマシンに展開する場合など、スケジュールタスクの管理に劇的な変化をもたらします。

このガイドでは、PowerShellを使ってスケジュールされたタスクを作成、変更、実行、そしてエクスポート/インポートする方法を解説します。起動時にスクリプトを実行するタスクを設定したり、毎週のバックアップをスケジュールしたりするなど、PowerShellは非常に便利です。さらに、GUIがうまく動作しない場合や、一貫性を保つためにスクリプトを使いたい場合にも、PowerShellは大きな助けとなるでしょう。PowerShellのコマンドやヒント、そしてWindowsの画面で頭を悩ませる場面もいくつかあるかもしれません。

PowerShell を使用して Windows のスケジュールされたタスクを管理する方法

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

では、まずはタスクを作成しましょう。タスクスケジューラ であれこれクリックするのはもうやめましょう(本当に必要な場合を除く)。PowerShell ならScheduledTasksモジュールですべて実行できます。構文に慣れれば、繰り返しタスクの設定がずっと簡単になります。

なぜわざわざ?起動時や特定の時間にスクリプトを実行したい場合、あるいは昇格した権限で実行したい場合も、PowerShellなら数行で実現できます。つまり、スクリプトのTrigger実行タイミング、スクリプトの動作ActionPrincipalスクリプトの実行者を指定してスクリプトを作成し、スケジューラに登録するだけです。

一般的なセットアップの概要は次のとおりです。

  • タスク名を設定します:$NewTaskName = "StartupScript_PS"
  • ユーザーアカウントを選択します。ログインするユーザーに関係なく実行したい場合はSYSTEMが便利ですが、他のユーザーの場合はユーザー名を指定します"DOMAIN\username"。管理者以外のユーザーとして実行する場合は、バッチジョブとしてログオンできるように許可されている必要があります(ローカルポリシーで「バッチジョブとしてログオン」を確認してください)。
  • システム アカウントの例:
  • $User="NT AUTHORITY\SYSTEM"
  • 特定のユーザーの場合:
  • $User = "woshub\sysops1"

毎日 10:00 に実行されるトリガーを作成するには、次のようにします。

$Trigger = New-ScheduledTaskTrigger -At 10:00am -Daily

ヒント: スパイシーな気分の場合には、他のスケジュール オプションもあります:

  • 起動時に実行:$Trigger = New-ScheduledTaskTrigger -AtStartup
  • ユーザーがログインしたときに実行:$Trigger = New-ScheduledTaskTrigger -AtLogon
  • 一度限りのこと:$Trigger= New-ScheduledTaskTrigger -Once -At 03:00
  • 毎週特定の曜日:$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Wednesday -At 01:00

次に、タスクが実際に実行する処理を設定します。例えば、PowerShell スクリプトを実行する場合は、次のようにします。

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

この-Bypass部分は非常に重要です。これにより、PowerShell がポリシーによって怖がって実行を拒否することがなくなります。

最後に、タスクを Windows タスク スケジューラに登録します。

Register-ScheduledTask -TaskName $NewTaskName -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

これ-RunLevel Highestにより、必要に応じて管理者権限で実行されます。すべてがうまくいけば、タスクはタスクスケジューラライブラリに表示されます。これで設定が完了したことが確認できます。

環境によっては、Register-ScheduledTaskコマンドを初めて使用すると奇妙な動作をすることがあります。例えば、「準備完了」と表示されるものの、実際には実行されないなどです。通常は、再起動するか、PowerShellを管理者として実行することで問題は解決します。Windowsは当然ながら、必要以上に操作を難しくしているからです。

既存のタスクの変更と管理

後でタスクを微調整する必要がある場合は、 を使用できますSet-ScheduledTask。たとえば、新しいトリガーを追加したり、タスクを実行するユーザーを変更したりしたい場合などです。

$trigger1 = New-ScheduledTaskTrigger -At 05:00 -Weekly -DaysOfWeek Monday $trigger2= New-ScheduledTaskTrigger -At 05:00 -Weekly -DaysOfWeek Saturday $action = New-ScheduledTaskAction -Execute "myapp.exe" Set-ScheduledTask -TaskName StartupScript_PS -Trigger $trigger1, $trigger2 -Action $action 

または、実行しているユーザー アカウントを切り替える必要がある場合は、次のようになります。

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

注意:「アカウント名とセキュリティIDのマッピングがありません」というエラーが表示された場合は、ユーザー名をもう一度確認してください。Windowsは、特にドメインアカウントやローカルアカウントを操作している場合、エラーが発生することがあります。

タスクをリアルタイムで管理し、実行中のタスクを確認する

アクティブなタスクを表示するには、次のコマンドを実行します。

Get-ScheduledTask -TaskPath | ? { $_. State -ne 'Disabled' }

最後に実行された日時、エラーの有無、次回の実行予定日時が表示されます。トラブルシューティングを行う場合や、新しい設定が正常に動作しているかどうかを確認する場合に便利です。

今すぐタスクをキックしたいですか?Start-ScheduledTask -TaskName CheckServiceState— すると、すぐに実行されます。タスクを削除したい場合は、次のコマンドを実行してください。

Unregister-ScheduledTask -TaskName CheckServiceState

エクスポートとインポートのタスク — 共有は思いやり

この部分はちょっといいです。設定を XML にエクスポートして、コピーまたはバックアップできるようにします。

Export-ScheduledTask -TaskName StartupScript | Out-File c:\tmp\StartupScript.xml

そのバックアップを新しいPCにインポートするには?次の手順を実行してください。

Register-ScheduledTask -Xml (Get-Content "C:\tmp\StartupScript.xml" | Out-String) -TaskName "StartupScript"

これは、多数のマシンに展開する場合や、完璧に調整されたタスク設定のバックアップを保持したい場合に非常に便利です。エンタープライズ環境では、グループポリシーを使用してスケジュールされたタスクを展開することもできます。当然のことながら、数十台、数百台のマシンを管理する場合、グループポリシーは最適な方法です。

延々とクリックし続ける作業に追われていたなら、これで数時間短縮できるはずです。PowerShellには便利な機能が満載で、構文さえ理解してしまえば、大幅に時間を節約できます。

まとめ

  • スケジュールされたタスクを作成、編集、管理するには PowerShell コマンドを使用します。
  • トリガーは柔軟で、起動時、ログオン時、特定の時間、毎週実行できます。
  • アクションはスクリプト、プログラム、またはコマンドになります。
  • XML ファイルを介してタスクを簡単にエクスポートおよびインポートできます。
  • PowerShell + タスク スケジューラは、GUI よりもはるかに柔軟で自動化可能です。

まとめ

PowerShellでスケジュールタスクを設定するのは、最初は少し難しそうに感じるかもしれませんが、正直言ってそれだけの価値はあります。処理速度が速く、自動化も簡単で、複数のマシンの管理もはるかに楽になります。コマンドに慣れれば、なぜGUIをクリックする必要があったのか不思議に思うでしょう。ただし、Windowsが不調になり、再起動やPowerShellを管理者として実行する必要がある場合があるので、最初はあまりイライラしすぎないでください。一度慣れてしまえば、スケジュールタスクの管理はあっという間に完了します。