4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windows10でcronのような定期実行を実現

Last updated at Posted at 2020-09-03

本記事では、Windows 10でWindows Subsystem for Linuxなどの機能を使用せず、
Windows 10のデフォルト機能しか使用しない前提の話です。
あくまでも個人的なメモ程度ですが、ご参加になれば幸いです。

環境

  • Windows 10 Pro 1903
  • XAMPP(PHP5.6)
  • XAMPP(PHP7.3)

やり方

  • 実行したいコマンドをbatファイルとして作成
  • そのbatファイルをバックグラウンドで実行するためにvbsファイルを用意
  • 上記vbsファイルを定期実行するためにWindowsのタスクスケジューラを設定

詳細

Windows上のXAMPP環境で開発を行っているため、時々サーバー上のようにバッチ処理を行いたいが、
Windows標準機能ではLinuxのcrontab機能がないため、それっぽく定期的に定期実行をする方法を考えました。

実行例

C:\crontest\addTime.php
addTime.php
<?php
require 'vendor/autoload.php';
use Carbon\Carbon;

// time.txtに現在時刻を追記する
$textfile = 'C:\crontest\time.txt';
$contents = file_get_contents($textfile);

date_default_timezone_set('Asia/Tokyo');
$contents .= Carbon::now()->format('Y-m-d H:i:s')."\n";

file_put_contents($textfile, $contents);

(上記例ではCarbonを使用しているが、個人の好みです。
 日付時刻の処理はCarbonのほうが直感的な表現ができると思うからです。)
 
####実行したいコマンドをbatファイルとして作成

C:\crontest\addTime_command.bat
addTime_command.bat
C:\xampp73\xampp\php\php C:\crontest\addTime.php

※ phpを例として、上記のように同一Windowsの配下に複数バージョンをインストールしている場合、
  実行したいバージョンのphpのディレクトリを指定してください。

####そのbatファイルをバックグラウンドで実行するためにvbsファイルを用意

C:\crontest\addTime_batch.vbs
addTime_batch.vbs
Set ws = CreateObject("Wscript.Shell") 
ws.run "cmd /c ""C:\crontest\addTime_command.bat""", 0

※ 引数でウィンドウスタイルを設定します。 0は「ウィンドウを隠す」という意味です。

上記vbsファイルを定期実行するためにWindowsのタスクスケジューラを設定

Windowsメニュー
 →Windows管理ツール
  →タスクスケジューラ

もしくは
Windowsアイコン右クリック
 →ファイル名を指定して実行する
  →taskschd.msc

task01.png

task02.png
操作ペインの「タスクの作成」を選択すると「タスクの作成」画面が表示されます。
適当に名前などを付けてください。

task03.png

トリガータブを選択し、「新規」ボタンを押すと「新しいトリガー」画面が表示されます。
タスクの開始を「スケジュールに従う」、どのぐらいの頻度で実行するかは自由に調整してください。
本例では1分間間隔で設定。
設定を「1回」、繰り返し間隔を「1分間」、継続時間を「無期限」に設定します。
(プルダウンメニューの中には1分間の選択がないのですが、手入力が可能です。)
task04.png

操作タブを選択し、「新規」ボタンを押すと「操作の編集」画面が表示されます。操作を「プログラムの開始」とし、プログラム/スクリプト欄に「wscript.exe」、引数の追加欄にはvbsのパス名(C:\crontest\addTime_batch.vbs)を記入します。
パス名に空白を含む場合はパス名を "~" でくくってください。

最後にOKボタンで、タスクの作成完了となり、定期実行が開始されます。
次回タスク実行時刻、前回の実行時刻、前回の実行結果(成功/失敗)などについては、
タスクスケジューラで確認することが可能です。

実行結果

C:\crontest\time.txt
time.txt
2020-09-03 12:15:00
2020-09-03 12:16:00
2020-09-03 12:17:00

最後に

繰り返し処理ができると言っても、設定の方法はcronの指定方法とだいぶん違いますね。
一応Laravelのスケジューラを実行する際にはこういう風に設定すれば良いと思います。
もっと細かく設定したい場合は、別途cron機能があるソフトをインストールするか、
Windows Subsystem for Linuxをダウンロード・有効にしてcronで設定してみてください。

以上、お役に立てればうれしいです!

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?