Windowsでcronのような定期実行をしたいなら、まずはタスクスケジューラーを選べばOKです。設定をコードで管理したいならPowerShellのRegister-ScheduledTask、Linuxのシェルスクリプトやcrontabをそのまま使いたいならWSL cronが向いています。
Linuxではcron使えばいっか、なんですがWindowsだとどれを使えばいいか迷いますよね。 タスクスケジューラーだけじゃなく、PowerShellのRegister-ScheduledTaskやWSL上のcronなど 複数の選択肢があって、筆者もしばらく「なんとなくタスクスケジューラー」で済ませていました。
この記事では3つのツールの特徴と向き不向きを整理し、場面別の選び方をまとめています。 「とりあえずどれを使えばいいか」という判断にはフローチャートも用意したので参考にしてください。
OS:Windows 11 Home 25H2
ビルド番号:26200.8246
WSL:2.6.3.0
Ubuntu:24.04.4 LTS
PowerShell:7.6.3
結論
- とりあえず簡単にやりたい → タスクスケジューラー
- スクリプトで柔軟に制御したい → PowerShell
- Linux感覚でやりたい → WSL+cron
Windowsの自動化手段:3つのアプローチ
まず全体像を整理します。 3つとも「定期実行」という目的は同じですが、管理方法・得意な対象・Windows連携の深さが異なります。
| 比較項目 | タスクスケジューラー | PowerShell | WSL cron |
|---|---|---|---|
| 設定方法 | GUI | コード | crontab |
| Windowsとの相性 | 高い | 高い | WSL依存 |
| Git管理 | 不向き | 向いている | 向いている |
| Linux資産の流用 | 不向き | 一部可能 | 向いている |
| 迷ったとき | 第一候補 | コード管理時 | Linux環境前提時 |
タスクスケジューラー
Windowsに標準搭載されているGUIツールです。「スタートメニュー → タスク スケジューラ」から起動できます。
タスクスケジューラーの各タブ(全般・トリガー・操作・条件・設定)の設定内容はこちらで詳しく解説しています。

タスクスケジューラーが向いているケース
- GUIでポチポチ設定できる
.batや.ps1を定期実行したい- ログオン時・起動時など「イベントトリガー」を活用したい
- 管理PCが複数人で使われる環境で設定を視覚的に確認したい
「毎日9時にExcelのマクロを動かす」「PCが起動したら特定のスクリプトを走らせる」といった用途はタスクスケジューラーが最も手軽です。
タスクスケジューラーが向いていないケース
- スクリプトからタスクを登録・変更したい
- Gitなどでタスク定義をバージョン管理したい
- Linuxスクリプト(
.sh)をそのまま実行したい - cronライクな細かいスケジュール指定をしたい
GUIが強みな分「コードとして管理する」用途にはやや相性が悪いです。
PowerShellでスケジュール登録(Register-ScheduledTask)
タスクスケジューラーをPowerShellコマンドから操作する方法です。 GUIでできることをコマンドラインでも実現できます。
コマンドラインからタスクを登録する方法
以下は「毎日9時に指定のPowerShellスクリプトを実行する」タスクを登録する例です。
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-NonInteractive -File C:\Scripts\【スクリプト名】.ps1"
$trigger = New-ScheduledTaskTrigger `
-Daily `
-At "09:00"
$settings = New-ScheduledTaskSettingsSet `
-ExecutionTimeLimit (New-TimeSpan -Hours 1) `
-RunOnlyIfNetworkAvailable
Register-ScheduledTask `
-TaskName "【タスク名】" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-RunLevel Highest- -Execute
実行するプログラムを指定します。PowerShell 7系はpwsh.exe、5.1系はpowershell.exeです。 - -Argument
プログラムに渡す引数です。-NonInteractiveを付けると対話的な入力プロンプトが出なくなります。 - -Daily -At “09:00”
毎日9時に実行するトリガーを設定します。-Weeklyや-RepetitionIntervalなど他のトリガーも使えます。 - -ExecutionTimeLimit
タスクが指定時間内に終わらなかった場合に強制終了する設定です。 - -RunLevel Highest
管理者権限でタスクを実行します。不要な場合は省略できます。
pwsh.exe(PowerShell 7系)かpowershell.exe(5.1系)かで挙動が変わる場面があります。 バージョン確認やアップグレード手順は以下で解説しています。

タスクを削除したいときはこちらです。
Unregister-ScheduledTask -TaskName "【タスク名】" -Confirm:$false注意:
-RunLevel Highestを使う構成や管理者権限を必要とするタスクでは管理者としてPowerShellを起動してください
スケジュールで呼び出す.ps1スクリプト自体が実行ポリシーの制限を受けて動かないケースがあります。「このシステムではスクリプトの実行が無効になっているため~」というエラーが出た際はこちらを参照してください。

PowerShellが向いているケース
- AnsibleやシェルスクリプトでWindowsのタスクを自動登録したい
- プロビジョニング・セットアップスクリプトに組み込みたい
- Gitでタスク定義をコードとして管理したい
- 複数PCに同じタスクを一括展開したい
タスクスケジューラーとバックエンドは同じなので、GUIで確認・修正することもできます。 「コードで管理するけど確認はGUIで」という使い方ができるのが便利なところですね!
WSL上のcron
WSL(Windows Subsystem for Linux)でLinuxのcronを動かす方法です。Linuxライクなシェルスクリプトをそのまま定期実行したい場合に向いています。
WSLのインストール状況の確認方法や導入手順はよくある質問を参照してください。
WSLでcronを動かす手順
現在のWSLではwsl --installで導入するUbuntuはsystemdが標準になっています。そのため、古いWSL環境と現在のUbuntuではcronサービスの起動方法が異なる場合があります。まずsystemctl status cronで状態を確認してください。
systemdでcronを有効にしても、systemdサービスだけでWSLインスタンス自体が常時起動し続けるわけではありません。Windows起動直後から確実に処理を走らせたい用途では、タスクスケジューラー側からWSLを起動する構成も検討します。
which cron/usr/sbin/cron何も表示されない場合はインストールされていないので、以下でインストールします。
sudo apt install croncrontab -e0 9 * * * /home/【ユーザー名】/scripts/【スクリプト名】.sh >> /home/【ユーザー名】/logs/output.log 2>&1WSLはWindowsのプロセスとして動いており、Windowsを再起動するとcronも止まります。 タスクスケジューラーと組み合わせてログオン時に自動起動させるのが現実的です。
$action = New-ScheduledTaskAction `
-Execute "wsl.exe" `
-Argument "-u root service cron start"
$trigger = New-ScheduledTaskTrigger -AtLogon
Register-ScheduledTask `
-TaskName "WSL-cron-autostart" `
-Action $action `
-Trigger $trigger `
-RunLevel HighestWindows側のファイルを操作する際の注意点
WSLからWindowsのファイルにアクセスする場合、パスの書き方が変わります。
| 環境 | パスの書き方 |
|---|---|
| Windowsのパス | C:\Users\【ユーザー名】\Documents |
| WSLからWindowsへのアクセス | /mnt/c/Users/【ユーザー名】/Documents |
| WindowsからWSLのファイルへ | \\wsl$\Ubuntu\home\【ユーザー名】 |
パフォーマンスの観点から、できるだけWSLのファイルシステム(/home/以下)で完結するスクリプトを書き、Windowsファイルの操作は最小限にするのが無難です。
注意:
cronの実行環境はログインシェルとは異なるため、PATHが通っていないコマンドが失敗することがあります。スクリプト内でコマンドのフルパスを指定するか、スクリプト冒頭でexport PATH=...を記述する習慣をつけておくといいです。
WSL cronが向いているケース
.shスクリプトをそのまま定期実行したい- Linuxサーバーで使っているcrontabをそのまま移植したい
awkやsedなどLinuxコマンドを組み合わせたスクリプトを動かしたい- 開発環境のセットアップやデータ処理をLinux環境で完結させたい
ツール選択フローチャート

よくある質問
まとめ
- タスクスケジューラーはGUIで手軽に設定できるWindowsの標準ツールだよ。
- PowerShellの
Register-ScheduledTaskはタスクスケジューラーをコードで管理したいときに使うよ。 - WSL cronはLinuxスクリプトをそのまま動かしたいときに向いているよ。
- WSL cronはWindowsの再起動でプロセスが止まるため、タスクスケジューラーと組み合わせて自動起動させてね。
- 迷ったら「GUIで設定したい → タスクスケジューラー」「コード管理 → Register-ScheduledTask」「Linux環境 → WSL cron」で選んでね。
おまけ:サードパーティ製ツール
VisualCron – 個人〜中規模チーム向け
VisualCron: an automation, integration and task… | Visual Cron
Windowsサービスとして動作するためユーザーがログオンしていない状態でもタスクを実行できます。エンタープライズ向けツールと比べると価格帯が手頃で、コストパフォーマンスの面で評価されています。一方で使いやすさの点では慣れが必要という声もあります。
JAMS Scheduler – 中〜大規模向け
Workload Automation & Job Scheduling Software | JAMS
タスクスケジューラーの「単一マシン限定」という制約を解消し、クロスプラットフォームのジョブスケジューリングを一元管理できます。詳細なログ出力・エラーハンドリング・PowerShellサポートが特徴で、Microsoft環境との親和性が高いです。
ActiveBatch – 中〜大規模向け
ビジネスカレンダーやタイムゾーン対応、イベントベースの自動化、レポート・監査向けの分析機能を備えています。PowerShellスクリプト・バッチファイルとの統合性が高く評価されていますが、複雑なワークフローでは学習コストが高くなりがちなようです。
Stonebranch – 大規模〜エンタープライズ向け
Stonebranch | Hybrid IT Automation Solutions & Software
複数システムにまたがる集中型ワークフロー自動化が可能です。ビジュアルインターフェース・SLAトラッキング・リアルタイムモニタリングを標準で備えており、金融・医療などコンプライアンス追跡が必要な業界でも広く採用されています。






