Windows で cron っぽいことを実現するツールやコマンド七選

cron みたいなジョブスケジューラを Windows でも使えないかと思い、既存ツールを調べてみました。

# 用途別まとめ
- :rabbit: 「GUI で使いたい＆無難に Windows 標準機能で実現したい」
  - タスクスケジューラ
- :pig: 「コマンドで使いたい＆無難に Windows 標準機能で実現したい」
  - at コマンド, schtasks コマンド
  - (PowerShell使いなら) Scheduled Tasks Cmdlets
- :dog: 「本家 cron と同じ操作感で使いたい」
  - Cygwin で cron
- :cat: 「crontab 表記で使いたい」
  - cronNT (C++製実行ファイル)
  - CRONw (Perlスクリプト)
  - pycron (Pythonスクリプト)
- :tiger: 「国産で日本語ドキュメントが良い」
  - cronNT

# ツール一覧

## タスクスケジューラ
- Windows 標準
- GUI(管理ツールみたいなUI)
- トリガー(タスクの実行タイミング)の設定が煩雑
  - 以下画像を見てください
- トリガーの設定が重い
  - 初回起動時に svchost.exe が一分くらいガリガリ動きやがった

Windows 標準だけあって作りは堅固だが、高機能かつ GUI も煩雑なので使い慣れるまで苦労しそう。また、GUI なので「設定ファイルに書いたらおわり」みたいな気軽な運用はしづらい。

以下はトリガー設定の画面です。

![taskscheduler_new_trigger.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/670d9d35-4041-f11d-f3bc-47d10690ac54.jpeg)

## AT コマンド
- Windows 標準
- CLI
- 内部的にはタスクスケジューラ(Scheduleサービス)が動作している

タスクスケジューラに対するタスクの CRUD をコマンドで行えるというもの。

（Usage を見てみたら使い方が煩雑そうなので）多少練習が必要と思われる。 [How To Use the AT Command to Schedule Tasks](https://support.microsoft.com/en-us/help/313565/how-to-use-the-at-command-to-schedule-tasks) あたりでサンプル見た方が良いかも。

あと [What is the Windows version of cron? - Stack Overflow](https://stackoverflow.com/questions/132971/what-is-the-windows-version-of-cron) によると、Windows のバージョンによっては at コマンドではなく `schtasks` コマンドを使う必要がある。

## pycron
[Windows でも cron を使う - メモ用紙](http://scientre.hateblo.jp/entry/20130220/cron_on_windows)

Python 製で、crontab 表記で書ける Windows 用 cron……らしいが、かなり古い。公式サイトも死んでるので上記は紹介ブログへのリンクにした。

※(余談) pycron には [kipe/pycron: Simple cron-like parser for Python, which determines if current datetime matches conditions](https://github.com/kipe/pycron) という「crontab 表記を実現する Python ライブラリ」もある。ややこしい。

## CRONw
[CRONw - CRON for Windows](http://cronw.sourceforge.net/)

Perl製。Windows サービスとして動作。WinXP までしか動作確認されてなくて古い。

## cronNT
[cronNTの詳細情報 : Vector ソフトを探す！](http://www.vector.co.jp/soft/winnt/util/se232096.html)

タスクスケジューラや AT コマンドが使えない or それでは満足できない用。インストールして、バッチファイル叩いてサービス登録して、iniファイルに crontab 表記で設定を書くという感じ。

紹介文を抜粋すると、

```
cronNTは、UNIXの cron/crontab ライクなスケジューラサービスです。
INIファイルにスケジュールを書き込み、サービスに登録するだけです! 
```

使うところまでは試してないけど、（この手のソフトは英語が多いのに対して）日本語だし、README もしっかり書いてあるし、が地味にありがたい。C++ ソースも添付されているので勉強にもなる。

- 参考
  - [Windowsでcron (4) cronNT - pc.casey.jp](http://pc.casey.jp/archives/153902111)
  - [cronNT - LinuxユーザーがWindowsでcronを使いたいとき - Project MultiBurst](http://www.multiburst.net/project-multiburst/archives/2007/03/09/1703.php)

## Cygwin で cron
cron パッケージと cygrunsrv パッケージを使う。Windows サービスとして動作させるみたい。

Cygwin だけあって本家 cron の再現度が高いのが強みか。

- 参考
  - [便利だったらどれでもいいじゃん！(k-square)](https://www.yotta-zetta.com/k-square/cygwin/cron.html)
  - [WindowsでCygwinを使ってcronする - тояｉｓц's technical note](http://hitorisu.hatenablog.jp/entry/2012/08/10/183612)

## PowerShell で Scheduled Tasks Cmdlets
PowerShell に Scheduled Tasks Cmdlets というコマンドレット（Powershellコマンド）がある。詳しく見てないので、タスクスケジューラをいじるものなのか、それともタスクスケジューラっぽいスケジューリング機能を実現したものなのかは不明。

PowerShell が得意な人は、調べてみても良いと思う。

- 参考
  - [What is the Windows version of cron? - Stack Overflow](https://stackoverflow.com/questions/132971/what-is-the-windows-version-of-cron)
  - [Scheduled Tasks Cmdlets in Windows PowerShell](https://technet.microsoft.com/en-us/library/jj649816(v=wps.630).aspx)

# おわりに
Windows で cron っぽいことを実現する方法についてまとめてみました。他にもオススメや補足や間違い等がありましたら教えてください :smile: