本記事にはアフィリエイトリンクを含みます。Amazonのアソシエイトとして収益を得る場合があります。

タスクスケジューラー vs PowerShell vs WSL cron:Windows自動化ツールの使い分けガイド

Windowsのアイキャッチ Windows
Windows

Linuxではcronなんですけど。Windowsではやっぱりタスクスケジューラーなのかなぁ、くらいの印象しかありませんでした。しかしタスクスケジューラーのほかにPowerShellのRegister-ScheduledTask、WSL上のcronなど別の手段があるようです。

この記事ではそれぞれの特徴と向き不向きを整理し、どんな場面でどれを選べばいいかをフローチャートでも確認できるようにまとめています。

この記事でわかること

  • Windows上でスケジュール実行できる3つの手段の概要
  • タスクスケジューラー・PowerShell(Register-ScheduledTask)・WSL cronそれぞれの向き不向き
  • 迷ったときに使えるツール選択フローチャート

Windowsの自動化手段:3つのアプローチ

まず全体像を整理します。

3つとも「定期実行」という目的は同じですが、管理方法・得意な対象・Windows連携の深さが異なります。

ツール特徴主な用途
タスクスケジューラーGUIで設定できる。Windows標準搭載。バッチファイル・PowerShellスクリプトの定期実行
PowerShell(Register-ScheduledTask)コマンドラインでタスクを登録できる。CI/CDやプロビジョニングスクリプトへの組み込み
WSL上のcronLinuxのcronをWSL内で動かす。Linuxスクリプト・シェルスクリプトの定期実行

タスクスケジューラー

Windowsに標準搭載されているGUIツールです。「スタートメニュー → タスク スケジューラ」から起動できます。

向いているケース

  • GUIでポチポチ設定可能
  • .bat.ps1を定期実行したい
  • ログオン時・起動時など「イベントトリガー」を活用したい
  • 管理PCが自分以外にも使われる環境で設定を視覚的に確認したい

「毎日9時にExcelのマクロを動かす」「PCが起動したら特定のスクリプトを走らせる」といった用途はタスクスケジューラーが最も手軽です。

向いていないケース

  • スクリプトからタスクを登録・変更したい
  • バージョン管理(Gitなど)でタスク定義を管理したい
  • Linuxスクリプト(.sh)をそのまま実行したい
  • cronライクな細かいスケジュール指定をしたい

GUIが強みな分「コードとして管理する」という用途にはやや相性が悪いです。

PowerShellでスケジュール登録(Register-ScheduledTask)

タスクスケジューラーをPowerShellコマンドから操作する方法です。GUIでできることをコマンドラインでも実現できます。

コマンドラインからタスクを登録する方法

以下は「毎日9時に指定のPowerShellスクリプトを実行する」タスクを登録する例です。

PowerShell
  • -Execute:
    実行するプログラムを指定します。PowerShellスクリプトを動かす場合はpwsh.exeです。(PowerShell 5.x系の場合はpowershell.exeです。)
  • -Argument:
    プログラムに渡す引数です。-NonInteractiveを付けると対話的な入力プロンプトが出なくなります。
  • -Daily -At “09:00”:
    毎日9時に実行するトリガーを設定します。-Weekly-RepetitionIntervalなど他のトリガーも使えます。
  • -ExecutionTimeLimit:
    タスクが指定時間内に終わらなかった場合に強制終了する設定です。
  • -RunLevel Highest:
    管理者権限でタスクを実行します。管理者権限が不要な場合は省略できます。

タスクを削除したいときはこちらです。

PowerShell

注意: Register-ScheduledTaskは管理者権限で実行する必要があります。PowerShellを右クリック→「管理者として実行」で起動してから使ってください。

向いているケース

  • Ansibleやシェルスクリプトでタスクを自動登録したい
  • プロビジョニング・セットアップスクリプトに組み込みたい
  • Gitでタスク定義をコードとして管理したい
  • 複数のPCに同じタスクを一括展開したい

タスクスケジューラーとバックエンドは同じなので、GUIで確認・修正することもできます。「コードで管理するけど確認はGUIで」という使い方もできるのが便利なところですね!

WSL上のcron

WSL(Windows Subsystem for Linux)でLinuxのcronを動かす方法です。Linuxライクなシェルスクリプトをそのまま定期実行したい場合に向いています。

WSLがPCにインストールされているか、インストールする方法はQAを参照してください。

WSLでcronを動かす方法

WSLはデフォルトでcronが自動起動しないため、少し工夫が必要です。

  • Step
    cronのインストール確認
    コマンド
    コマンド – 実行結果

    何も表示されない場合はインストールされていないので、下記でcronをインストールします。

    コマンド
  • Step2
    crontabの編集
    コマンド
    crontab
  • Step3
    WSL起動時にcronを自動スタートさせる

    WSLはWindowsのプロセスとして動いており、Windowsを再起動するとcronも止まります。Windowsのタスクスケジューラーと組み合わせて自動起動させるのが現実的です。

    Windowsのユーザーログオン時にWSL内のcronを起動するタスクを登録するという感じです。

    PowerShell

Windows側のファイルを操作する際の注意点

WSLからWindowsのファイルにアクセスする場合、パスの書き方が変わります。

環境パスの書き方
WindowsのパスC:\Users\【ユーザー名】\Documents
WSLからWindowsへのアクセス/mnt/c/Users/【ユーザー名】/Documents
WindowsからWSLのファイルへ\\wsl$\Ubuntu\home\【ユーザー名】

パフォーマンスの観点から、できるだけWSLのファイルシステム(/home/以下)で完結するスクリプトを書き、Windowsファイルの操作は最小限にするのが無難です。

注意: cronの実行環境はログインシェルとは異なるため、PATHが通っていないコマンドが失敗することがあります。スクリプト内でコマンドのフルパスを指定するか、スクリプト冒頭でexport PATH=...を記述する習慣をつけておくといいです。

向いているケース

  • .shスクリプトをそのまま定期実行したい
  • Linuxサーバーで使っているcrontabをそのまま移植したい
  • awksedなどLinuxコマンドを組み合わせたスクリプトを動かしたい
  • 開発環境のセットアップやデータ処理をLinux環境で完結させたい

ツール選択フローチャート

タスクスケジューラー、PowerShell、WSL cronの選び方

Q&A

Q
タスクスケジューラーとRegister-ScheduledTaskは同じもの?
A

バックエンドは同じです。Register-ScheduledTaskはタスクスケジューラーをPowerShellから操作するためのコマンドレットで、登録されたタスクはGUIのタスクスケジューラーでも確認・編集できます。

Q
WSLがインストールされているか確認したい。
A

WSLが入っているか確認したいときはこちらです。

PowerShell
PowerShell– 実行結果(インストール済みの場合)

Ubuntuが表示されればWSLがインストールされています。VERSION2であればWSL2として動いています。

Q
WSLがインストールされていない場合はどうすればいい?
A

Windows 10 バージョン2004以降・Windows 11であれば、コマンド1行でインストールできます。

PowerShell
PowerShell– 実行結果(インストール済みの場合)

古いバージョンのWindows 10(バージョン1903〜2004未満)ではwsl --installが使えない場合があります。その場合はMicrosoft公式ドキュメントの「手動インストール手順」を参照してください。

Q
WSL2とWSL1でcronの動作は変わる?
A

基本的な使い方は変わりません。ただしWSL2はHyper-Vベースの軽量VMで動くため、ネットワーク構成がWSL1と異なります。外部ネットワークアクセスが必要なスクリプトでは注意が必要なこともあります。

Q
Windowsがスリープするとタスクは実行されない?
A

タスクスケジューラーの設定で「タスクを実行するためにコンピューターをスリープ解除する」にチェックを入れると、スリープ中でも実行タイミングでスリープ解除されます。ただしWSL cronの場合は、WSLプロセス自体が起動していないと動かないためスリープ解除だけでは不十分な場合があります

Q
cronの書き方がわからない
A

crontab.guruというサイトでcron式を視覚的に確認できます。「毎時15分」「毎週月曜9時」などをその場で検証できるのでとても便利です。

まとめ

  • タスクスケジューラーは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サービスとして動作するため、ユーザーがログオンしていない状態でもタスクを実行できます。タスク自動化・スケジューリング・連携機能の面で高く評価されており、コストパフォーマンスが良いとされていますが、一方で使いやすさの点で難ありという指摘もあるようです。
エンタープライズ向けツールが数万ドル規模の初期投資を要するのに対し、VisualCronはライセンス料が必要ながら比較的手頃な価格帯に位置しています。

JAMS Scheduler – 中〜大規模向け

Workload Automation & Job Scheduling Software | JAMS

Windowsタスクスケジューラーの限界だった単一マシン限定の問題を解消し、クロスプラットフォームのジョブスケジューリングを一元管理できます。詳細なログ出力・エラーハンドリング・PowerShellサポートが特徴で、スクリプト主体の複雑なワークフロー管理に適しています。
WindowsサーバーやSQL Server、Active Directoryとのネイティブ統合が強みで、Microsoft中心の環境に向いています。

ActiveBatch – 中〜大規模向け

ActiveBatch By Redwood

ビジネスカレンダーやタイムゾーンに対応したきめ細かいスケジューリング、イベントベースの自動化、レポートや監査のための豊富な分析機能を備えています。
インターフェースの使いやすさや、PowerShellスクリプト・バッチファイルとの統合性が高く評価されています。一方で複雑なワークフローでは学習コストが高くなりがちのようです。

Stonebranch – 大規模〜エンタープライズ向け

Stonebranch | Hybrid IT Automation Solutions & Software

Windowsタスクスケジューラーのシングルノード限定という制約に対し、複数システムにまたがる集中型ワークフロー自動化が可能です。ビジュアルインターフェース・SLAトラッキング・リアルタイムモニタリング・Integration Hubによる連携テンプレートを標準で備えています。
金融・医療など、コンプライアンス追跡が必要な業界でも広く採用されています。

当ブログの内容はできる限り正確な情報を提供するよう努めていますが、利用にあたっては自己責任でお願いいたします。
掲載内容に基づく操作・設定などによって生じたトラブルや損害について、当サイトは一切の責任を負いません。
タイトルとURLをコピーしました