Windows で cal コマンドを使ってカレンダー一覧を作る

テキストのカレンダー一覧が欲しかったのでつくることにした。Windows には cal コマンドがないので何とかして入手し、これを何度も呼び出すようなバッチファイルを書くことで実現。

前提

  • Windows7 32bit

1: Gcal の入手

cal コマンドの代替として GnuWin32 の Gcal を使う。

上記はタイトルが「GnuWin」となっているが、ダウンロードするのは Gcal に必要な部分のみである。ちなみにインストーラーなので普通に実行してインストールする。

(参考) インストール後のファイル構成

Gcal に必要なファイルのみが整っている。

$ dir /b "C:\Program Files\GnuWin32\bin"
gcal-daily
gcal-daily.orig
gcal-ddiff
gcal-ddiff.orig
gcal-ddiffdrv
gcal-ddiffdrv.orig
gcal-dst
gcal-dst.orig
gcal-gcalltx
gcal-gcalltx.orig
gcal-gcalltx.pl
gcal-gcalltx.pl.orig
gcal-moon
gcal-moon.orig
gcal-mrms
gcal-mrms.orig
gcal-srss
gcal-srss.orig
gcal-wlocdrv
gcal-wlocdrv.orig
gcal.exe
gcal2txt.exe
libiconv2.dll
libintl3.dll
rxspencer.dll
tcal.exe
txt2gcal.exe

2: Gcal を試しに実行してみる

年と月を指定してみた。

$ "C:\Program Files\GnuWin32\bin\gcal.exe" 01 2019

     January 2019
 Su Mo Tu We Th Fr Sa
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28 29 30 31

年だけ指定してみた(このオプションは続く一覧作成時に使う)。

$ "C:\Program Files\GnuWin32\bin\gcal.exe" 2004


                                  2004


      January                   February                   March
 Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
              1  2  3       1  2  3  4  5  6  7          1  2  3  4  5  6
  4  5  6  7  8  9 10       8  9 10 11 12 13 14       7  8  9 10 11 12 13
 11 12 13 14 15 16 17      15 16 17 18 19 20 21      14 15 16 17 18 19 20
 18 19 20 21 22 23 24      22 23 24 25 26 27 28      21 22 23 24 25 26 27
 25 26 27 28 29 30 31      29                        28 29 30 31



       April                      May                       June
 Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
              1  2  3                         1             1  2  3  4  5
  4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12
 11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19
 18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26
 25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30
                           30 31


        July                     August                  September
 Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
              1  2  3       1  2  3  4  5  6  7                1  2  3  4
  4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11
 11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18
 18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25
 25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30



      October                   November                  December
 Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
                 1  2          1  2  3  4  5  6                1  2  3  4
  3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11
 10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18
 17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25
 24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31
 31

3: カレンダー一覧をつくる

Gcal が動くことがわかったので、カレンダー一覧をつくる。

まともにコマンドラインオプションを読み解くと骨が折れる ので手抜きすることに。前記にて、年数だけ与えると「その年の月表示を 3 列 4 行で並べて表示する」ことことがわかっているので、この出力を並べることにした。バッチファイルを使う。

output.bat

@echo off
setlocal
set calcmd="C:\Program Files\GnuWin32\bin\gcal.exe"
set calstart=1970
set calend=2100

set name_merged=all_%calstart%_%calend%.txt

echo.> %name_merged%
for /L %%i in (%calstart%,1,%calend%) do (
    echo %%i...
    %calcmd% %%i > %%i.txt
    type %%i.txt >> %name_merged%
)

これを実行すると、以下のようにファイルがつくられる。

$ dir /b
...
2019/06/27  19:12             2,428 1970.txt
2019/06/27  19:12             2,428 1971.txt
...
2019/06/27  19:12             2,428 2100.txt
2019/06/27  19:12           318,070 all_1970_2100.txt
2019/06/27  19:12               299 output.bat

all_1970_2100.txt は 1970.txt、1971.txt、……の内容を一ファイルでずらりと並んだもの。

とりあえず最低限カレンダー一覧をゲットできたので良しとする。

(余談1) cal コマンドで Gcal を呼び出せるようにする

以下のバッチファイルを PATH の通ったフォルダに置く。

cal.bat

@echo off
"C:\Program Files\GnuWin32\bin\gcal.exe" %*

(余談2) カレンダーのスペル

  • calendar
  • calender

突然ですが正しいのはどっちでしょう。

……前者、calendar が正解です。dar なんですね(最近まで普通に間違ってた)。

(余談3) カレンダーへのアクセス

今回つくったカレンダーにどうやってアクセスするか。私は以下のようにした。

  • github\stakiran\text\calendar に 1970.txt, 1971, ... 2100.txt を配置
  • 愛用している fenrir を再スキャン

これで fenrir から 2019 と打つだけで 2019 年のカレンダーにアクセスできる。fenrir は AutoHotkey にて Alt + 1 で起動できるようにしているので、実際は Alt + 1 → 2019 の二段階でアクセス可。かなり素早くカレンダーを開けるようになった。

Q: 「普通に余談 1 を整備してからコマンドプロンプトで cal 2019 と叩けばいいのでは?」

ダメ。コマンドプロンプト上の表示は見づらい。愛用のテキストエディタで見れることが重要なのである。

参考