はじめに

ディスクのチェックや不要ファイルの削除など、任意のプログラムを定期的に実行したいニーズは常にあると思います。
Windows XP以降には、タスクスケジューラと呼ばれるアプリケーションがあり、それを利用することでこのニーズを満たすことができます。
しかし、タスクスケジューラがないWindows 2000環境や、ユーザが管理権限を持たないOA環境など、タスクスケジューラを利用できないケースはそれなりに存在します。

このページでは、バッチファイルだけで定期的に任意のプログラムを実行する方法について説明します。

バッチファイルの作成

まず、「前回の起動からN日以上間隔が空いていたらプログラムを実行する」というバッチファイルを作成します。

以下がバッチファイルの例です。

バッチファイルのサンプル
@echo off
cls

rem ----------------------------------------------------------------

set /a duration=14
set previous_date_file=C:\TOOL\task_scheduler.txt

rem ----------------------------------------------------------------

set current_date=%date:~-10,10%

if exist %previous_date_file% ( set /p previous_date=<%previous_date_file% ) else ( set previous_date=2000/01/01 )

call :get_count %current_date%
set current_count=%errorlevel%

call :get_count %previous_date%
set previous_count=%errorlevel%

set /a limit_count="%previous_count%+%duration%"

if "%limit_count%" leq "%current_count%" (
call scheduled_task.bat
echo %current_date%>%previous_date_file%
)

goto :EOF

:get_count

set yyyymmdd=%1

set /a yy=%yyyymmdd:~-10,4%-2000
set mm=%yyyymmdd:~-5,2%
set dd=%yyyymmdd:~-2,2%
set /a leap=yy%%4
set offset=0

if %leap%==0 set offset=1

set /a count=(yy*365)+(yy/4)+dd

if "%mm%"=="02" set /a count=count+31
if "%mm%"=="03" set /a count=count+31+28+offset
if "%mm%"=="04" set /a count=count+31+28+offset+31
if "%mm%"=="05" set /a count=count+31+28+offset+31+30
if "%mm%"=="06" set /a count=count+31+28+offset+31+30+31
if "%mm%"=="07" set /a count=count+31+28+offset+31+30+31+30
if "%mm%"=="08" set /a count=count+31+28+offset+31+30+31+30+31
if "%mm%"=="09" set /a count=count+31+28+offset+31+30+31+30+31+31
if "%mm%"=="10" set /a count=count+31+28+offset+31+30+31+30+31+31+30
if "%mm%"=="11" set /a count=count+31+28+offset+31+30+31+30+31+31+30+31
if "%mm%"=="12" set /a count=count+31+28+offset+31+30+31+30+31+31+30+31+30

exit /b %count%

やっていることを簡単に説明すると、以下の通りです。

  1. まず、環境変数「current_date」に現在の日付を「YYYY/MM/DD」形式で格納します。
    環境変数「date」は、Windows XPでは「YYYY/MM/DD」形式ですが、Windows 2000では「曜日 YYYY/MM/DD」形式な為、整形して「YYYY/MM/DD」の部分だけを取り出しています。
  2. 次に、「previous_date_file」で設定されたパスのファイルから、前回実行時に保存した日時(「YYYY/MM/DD」形式)を「previous_date」に読み込みます。(ファイルがない場合には「2000/01/01」を設定します。)
    サブルーチン「get_count」を利用して、「current_date」および「previous_date」の値から、「2000/01/01」からの日数を計算し、それぞれ「current_count」および「previous_count」に格納します。
  3. 最後に、「current_count」と、「limit_count」(「previous_current」と「duration」の中身を足したもの)を比較し、「limit_count」が「current_count」以下の場合に「scheduled_task.cmd」を実行し、「previous_date_file」で設定されたパスのファイルに、今回の実行日時を保存します。

どうです、簡単でしょう?

肝はdateの整形、「set /a」を使った演算結果の格納、「set /p」を使ったファイル内の値の格納ぐらいでしょうか?

定期的に実行したいプログラムの内容は別ファイル「scheduled_task.cmd」中に記入してください。

「スタートアップ」の利用

あとは、上記で作成したバッチファイルを定期的に実行させるだけです。

バッチファイルを定期的に実行させるのには、スタートアップを利用します。
スタートアップは、PCが起動される際に実行するプログラムを格納しておくためのフォルダで、「スタート」→「プログラム」→「スタートアップ」を右クリックして「開く」を選択すること開くことが出来ます。

このフォルダに、先ほど作成したバッチファイルへのショートカットを格納してください。

これでPCを起動する度に上記のバッチファイルが実行され、バッチファイル内の環境変数「duration」で設定された日数間隔で「scheduled_task.bat」が実行されます。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


参考になった
2 (67%)
これじゃない
1 (33%)

【参考になった】 Windows10ですがタスクスケジューラでバッチファイルをどうしても実行できなかったのでUWSCを介して実行するようにしたのですが、それでもうまくいかなかったので参考にさせていただきます。 (2022/02/10 Thu 14:16:47)