DOS-BATでcalコマンドを実装してみました。
WSHなどは使わず、純粋にBATファイルのコマンドだけで作成しています。[cal.bat]

@echo off
setlocal
rem ********************************************************************************
if "%1"=="-h" goto USAGE
if "%1"=="--help" goto USAGE
if "%1"=="/?" goto USAGE
goto MAIN
rem ********************************************************************************
:USAGE
echo USAGE:
echo %~n0 [-h ^| --help ^| /?] [-3 ^| -y] [Month] [Year]
echo.
echo 【オプション】
echo -h, --help, /? ヘルプの表示
echo.
echo -3 3ヶ月カレンダーの表示(前月、当月、来月」)
echo -y 1年カレンダーの表示
echo Month 月を英語で入力(例:April)
echo Year 年を4桁で入力(yyyy)
echo ※1752年以前は表示されません
echo.
echo オプション無しで実行すると、今年・今月のカレンダーを表示します
goto :EOF
rem ********************************************************************************
:MAIN
rem ============ 日付の設定 ============
rem Mn…今月
set /a thisMn=%date:~5,2%
rem Yr…今年
set /a thisYr=%date:~0,4%
set Opt=0
if "%1"=="-3" set Opt=-3
if "%1"=="-y" set Opt=-y
:opt_loop
rem 月名の入力
if /i "%1"=="January" set Mn=1
if /i "%1"=="February" set Mn=2
if /i "%1"=="March" set Mn=3
if /i "%1"=="April" set Mn=4
if /i "%1"=="May" set Mn=5
if /i "%1"=="June" set Mn=6
if /i "%1"=="July" set Mn=7
if /i "%1"=="August" set Mn=8
if /i "%1"=="September" set Mn=9
if /i "%1"=="October" set Mn=10
if /i "%1"=="November" set Mn=11
if /i "%1"=="December" set Mn=12
rem 年の入力
set /a Yr=%1+0
shift
if not "%1"=="" goto opt_loop
rem 値の調整
if %Yr% LEQ 1752 set /a Yr=thisYr
rem ---引数に日付が含まれないとき
if not defined Yr set Yr=%thisYr%
if not defined Mn set Mn=%thisMn%
rem ========== メインの処理 ========
rem 1年オプション
if %Opt%==-y goto 1Year
rem 3ヶ月オプション
if %Opt%==-3 (
rem 先月
set /a Yr1=Yr
set /a Mn1=Mn-1
rem 今月
set /a Yr2=Yr
set /a Mn2=Mn
rem 来月
set /a Yr3=Yr
set /a Mn3=Mn+1
rem ----------
goto 3kagetu
)
rem 1ヶ月オプション
goto 1Month
rem ========== オプション別の動作 ==========
rem -----1年カレンダーの表示
:1Year
echo %Yr%
echo.
set Mn=0
:1YearCal
set /a Mn=%Mn%+1
set /a Mn1=%Mn%
set /a Mn2=%Mn%+1
set /a Mn3=%Mn%+2
call :subDate %Yr% %Mn1% 1
call :subDate %Yr% %Mn2% 2
call :subDate %Yr% %Mn3% 3
rem 描画
echo %Month1% %Month2% %Month3%
call :sub3calender
echo.
rem --------
if %Mn% LSS 12 goto 1YearCal
rem ---終了
goto :EOF
rem -----3ヶ月カレンダーの表示
:3kagetu
rem 年越しの処理
if %Mn1%==0 (
set /a Yr1=%Yr1%-1
set Mn1=12
)
if %Mn3%==13 (
set /a Yr3=%Yr3%+1
set Mn3=1
)
call :subDate %Yr1% %Mn1% 1
call :subDate %Yr2% %Mn2% 2
call :subDate %Yr3% %Mn3% 3
rem 3か月表示の準備
echo %Month1% %Yr1% %Month2% %Yr2% %Month3% %Yr3%
rem 描画
call :sub3calender
rem ---終了
goto :EOF
rem -----1ヶ月カレンダーの表示
:1Month
call :subDate %Yr% %Mn%
call :sub1calender
rem ---終了
goto :EOF
rem ================== 描画のための日付データの設定 ===========================
:subDate
rem 引数の受け取り
set Yr=%1
set Mn=%2
rem 3ヶ月表示の際に利用
set Number=%3
rem 月の名前の表示について(いったんMonthに格納)
if %Mn%==1 set Month= January
if %Mn%==2 set Month=February
if %Mn%==3 set Month= March
if %Mn%==4 set Month= April
if %Mn%==5 set Month= May
if %Mn%==6 set Month= June
if %Mn%==7 set Month= July
if %Mn%==8 set Month= August
if %Mn%==9 set Month=September
if %Mn%==10 set Month= October
if %Mn%==11 set Month=Noveember
if %Mn%==12 set Month=December
rem =========== 月末日を求める ============
if %Mn%==1 set Getumatu=31
rem 2月計算の準備(ifの外に書かないとエラーになる)
set Urr=Yes
set /a UrrAmari = %Yr% %%4
set /a UrrAmari2 = %Yr% %%400
if %Mn%==2 (
rem 年が4で割り切れると、うるう年。
if %UrrAmari% NEQ 0 set Urr=No
rem 年が100で割り切れて、かつ400で割り切れないと、うるう年ではない。
if %Yr:~-2%==00 (
if %UrrAmari2% NEQ 0 set Urr=No
)
)
if %Mn%==2 (
if %Urr%==Yes set Getumatu=29
if %Urr%==No set Getumatu=28
)
if %Mn%==3 set Getumatu=31
if %Mn%==4 set Getumatu=30
if %Mn%==5 set Getumatu=31
if %Mn%==6 set Getumatu=30
if %Mn%==7 set Getumatu=31
if %Mn%==8 set Getumatu=31
if %Mn%==9 set Getumatu=30
if %Mn%==10 set Getumatu=31
if %Mn%==11 set Getumatu=30
if %Mn%==12 set Getumatu=31
rem =========== 1日目の曜日を判定 ===========
rem 1月と2月は、それぞれ13、14で計算する
set Yr1=%Yr%
if %Mn%==1 (
set M=13
set /a Yr1=Yr-1
) else if %Mn%==2 (
set /a Yr1=Yr-1
set M=14
) else (
set M=%Mn%
)
rem C=年の上2桁、Y=年の下2桁
set /a C=%Yr1:~0,2%
set /a Y=%Yr1% - C*100
rem 曜日の計算式(Zellerの公式を利用)
set /a Wk= (( 21 * %C% / 4 ) + ( 5 * %Y% / 4 ) + ( 26 * ( %M% + 1 ) / 10 )) %%7 + 1
if not defined Number exit /b
rem ========== 戻り値の設定 ==========
set Month%Number%=%Month%
set Wk%Number%=%Wk%
set Getumatu%Number%=%Getumatu%
rem ===== 戻る
exit /b
rem ===========================================================================
rem ====================== 1ヶ月描画のサブルーチン ============================
:sub1Calender
rem ===========================================================================
rem 1ヶ月表示
echo %Month% %Yr%
echo Su Mo Tu We Th Fr Sa
rem ---1週目
set i=1
rem 1行目の空白部分を表示
:LoopBlank
if %i% LSS %Wk% (
set WeekStr=%WeekStr%
set /a i=i+1
goto LoopBlank
)
rem 1行目の数字部分を作成
set Dy=1
:LoopNumber
set WeekStr=%WeekStr% %Dy%
set /a Dy=Dy+1
set /a i=i+1
if %i% LEQ 7 goto LoopNumber
echo %WeekStr%
rem ---2週目以降
:LoopMonth
set WeekStr=
set i=1
:LoopWeek
if %Dy% LSS 10 (
set WeekStr=%WeekStr% %Dy%
) else (
set WeekStr=%WeekStr% %Dy%
)
set /a Dy=Dy+1
rem 日数が月末を越えると、週表示を行い、ループを出る
if %Dy% GTR %Getumatu% (
echo %WeekStr%
goto Break
)
set /a i=i+1
if %i% LEQ 7 goto LoopWeek
echo %WeekStr%
rem ---3週目以降
rem %Dy%の値のみ引き継がれる
if %Dy% LEQ %Getumatu% goto LoopMonth
:Break
rem ===== 戻る
exit /b
rem ===========================================================================
rem ====================== 3ヶ月描画のサブルーチン ============================
:sub3Calender
rem ===========================================================================
rem 3ヶ月表示
echo Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
set WeekStr=
rem ------1週目
rem 周回のカウント
set j=0
:Week1
set /a j=j+1
rem 曜日のカウント
set i=1
rem 1行目の空白部分を作成
:LoopBlank3
set /a Wk=Wk%j%
if %i% LSS %Wk% (
set WeekStr=%WeekStr%
set /a i=i+1
goto LoopBlank3
)
rem 1行目の数字部分を作成
set Dy=1
:LoopNumber3
set WeekStr=%WeekStr% %Dy%
set /a Dy=Dy+1
set /a i=i+1
if %i% LEQ 7 goto LoopNumber3
rem 3周する
set /a Dy%j%=Dy
if %j% LSS 3 (
set WeekStr=%WeekStr%
goto Week1
)
echo %WeekStr%
set WeekStr=
rem ------2週目以降
set j=1
rem 周回のカウント
:LoopMonth3
rem ループが終わっているときの処理
set /a Dy=Dy%j%
set /a Getumatu=Getumatu%j%
if %Dy% GTR %Getumatu% (
set WeekStr=%WeekStr%
goto :Break3
)
set i=1
set /a Dy=Dy%j%
set /a Getumatu=Getumatu%j%
:LoopDay3
if %Dy% LSS 10 (
set WeekStr=%WeekStr% %Dy%
) else (
set WeekStr=%WeekStr% %Dy%
)
set /a Dy=Dy+1
rem 日数が月末を越えると、残りを埋め、ループを出る
if %Dy% GTR %Getumatu% goto LoopLast3
set /a i=i+1
if %i% LEQ 7 (
goto LoopDay3
)
goto Break3
rem 残り日数の埋め立て
:LoopLast3
set /a i=i+1
if %i% GEQ 8 goto Break3
set WeekStr=%WeekStr%
goto LoopLast3
:Break3
rem 月別ループ
set WeekStr=%WeekStr%
set /a Dy%j%=Dy
set /a j=j+1
if %j% LEQ 3 goto LoopMonth3
echo %WeekStr%
set WeekStr=
rem 週のループ
set j=1
if %Dy1% LEQ %Getumatu1% goto LoopMonth3
if %Dy2% LEQ %Getumatu2% goto LoopMonth3
if %Dy3% LEQ %Getumatu3% goto LoopMonth3
rem ===== 戻る
exit /b
view raw cal.bat hosted with ❤ by GitHub

[出力イメージ]

 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$ cal
     June    2013
 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


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


$ cal -y
                                2013

       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  4  5                   1  2                   1  2
  6  7  8  9 10 11 12    3  4  5  6  7  8  9    3  4  5  6  7  8  9
 13 14 15 16 17 18 19   10 11 12 13 14 15 16   10 11 12 13 14 15 16
 20 21 22 23 24 25 26   17 18 19 20 21 22 23   17 18 19 20 21 22 23
 27 28 29 30 31         24 25 26 27 28         24 25 26 27 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  4  5  6             1  2  3  4                      1
  7  8  9 10 11 12 13    5  6  7  8  9 10 11    2  3  4  5  6  7  8
 14 15 16 17 18 19 20   12 13 14 15 16 17 18    9 10 11 12 13 14 15
 21 22 23 24 25 26 27   19 20 21 22 23 24 25   16 17 18 19 20 21 22
 28 29 30               26 27 28 29 30 31      23 24 25 26 27 28 29
                                               30

        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  4  5  6                1  2  3    1  2  3  4  5  6  7
  7  8  9 10 11 12 13    4  5  6  7  8  9 10    8  9 10 11 12 13 14
 14 15 16 17 18 19 20   11 12 13 14 15 16 17   15 16 17 18 19 20 21
 21 22 23 24 25 26 27   18 19 20 21 22 23 24   22 23 24 25 26 27 28
 28 29 30 31            25 26 27 28 29 30 31   29 30

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

実は4~5年に書いたネタだったり。