Comment detail
年間カレンダー (Nested Flatten)
一点訂正です。
47, 48, 50, 51行目で_ERRORという名前の変数を使用していますが、正しくは ERRORでし
た。(先頭のアンダースコアが不要。)
該当部分の処理を関数(擬似関数)内からメイン関数に移した際、変数名を変更するのを忘
れていました。とはいえ、setlocalとendlocalでスコープを細かく分けることはしていな
いので、投稿したものでも動作上問題はありません。
47, 48, 50, 51行目で_ERRORという名前の変数を使用していますが、正しくは ERRORでし
た。(先頭のアンダースコアが不要。)
該当部分の処理を関数(擬似関数)内からメイン関数に移した際、変数名を変更するのを忘
れていました。とはいえ、setlocalとendlocalでスコープを細かく分けることはしていな
いので、投稿したものでも動作上問題はありません。
現状を維持しながら cal -y のような表示形式にするのは難しかったので、以下のワンラ
イナーでもって「年間カレンダー」に対する回答とさせてください。
e.g.
C:\>echo off && (for /l %i in (1,1,12) do (echo. & cal %i 2008)) && echo on
January 2008
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
(中略)
December 2008
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





silverwire
#5121()
[
Batchfile
]
Rating0/0=0.00
出力形式はUnixの calコマンドを参考にしました。
バッチファイルですので、ファイル名を cal.batなどにして保存し、ダブルクリックして
ください。Windows 2000以降であれば動作すると思います。一瞬で終了しないようにする
には、69行目のendlocalの下に以下の行を追加してください。
e.g. pause >NUL
引数を指定しない場合はシステムの日時をもとに算出します。ただし、日本以外の地域の
日時表記を使用している環境では正常に動作しません。
e.g. C:\>cal 1 2008
@echo off :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: グローバル変数 setlocal set Y4=%2 set MM=%1 set DOW= set EOM= set COUNT= set ERROR= set IS_LEAP_YEAR=0 set MARGIN= set MONTH= set SPACE= set ARRAY_MONTH= :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: メイン関数 if "%3" NEQ "" echo usage: cal [month] [year] & goto :EOF if "%2" EQU "" ( if "%1" NEQ "" echo usage: cal [month] [year] & goto :EOF call :GetDate Y4 MM ) :: 8進数として解釈されないようにする。 set /a Y4=%Y4%+0 set /a MM=%MM%+0 call :IsNumber %Y4% _ERROR if %_ERROR% NEQ 0 echo usage: cal [month] [year] & goto :EOF call :IsNumber %MM% _ERROR if %_ERROR% NEQ 0 echo usage: cal [month] [year] & goto :EOF if %Y4% LSS 1 echo cal: illegal year value: use 1-9999 & goto :EOF if %Y4% GTR 9999 echo cal: illegal year value: use 1-9999 & goto :EOF if %MM% LSS 1 echo cal: illegal month value: use 1-12 & goto :EOF if %MM% GTR 12 echo cal: illegal month value: use 1-12 & goto :EOF call :GetMonthName ARRAY_MONTH call :GetMargin %MM% MARGIN call :GetSpace %MARGIN% SPACE call :GetArrayValue ARRAY_MONTH_%MM% MONTH call :PrintHeader %Y4% %MONTH% "%SPACE%" call :GetDayOfWeek %Y4% %MM% DOW :: 2 : セルの幅, 1 : セルの余白 set /a MARGIN=%DOW%*(2+1) call :GetSpace %MARGIN% SPACE call :GetEndOfMonth %MM% EOM call :IsLeapYear %Y4% %MM% IS_LEAP_YEAR if %IS_LEAP_YEAR% NEQ 0 set /a EOM+=1 call :PrintCalendar %EOM% %DOW% "%SPACE%" endlocal goto :EOF :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: ユーザー定義関数 :SetArrayValue set %1_%COUNT%=%2 goto :EOF :GetArrayValue for /f "delims== tokens=1,2" %%a in ('set^|findstr /b "%1="') do set %2=%%b goto :EOF :Increment set /a COUNT+=1 goto :EOF :GetDate set _DATE= for /f "tokens=1" %%d in ('date /t') do set _DATE=%%d set %1=%_DATE:~0,4% set %2=%_DATE:~5,2% goto :EOF :IsNumber set %2=0 echo %1|findstr /r "[^0-9]" >NUL 2>NUL if %ERRORLEVEL% EQU 0 set %2=1 goto :EOF :PrintHeader set _SPACE=%3 set _SPACE=%_SPACE:"=% echo %_SPACE% %2 %1 echo Su Mo Tu We Th Fr Sa goto :EOF :GetMonthName set _PATH=_.txt echo January > %_PATH% echo February >>%_PATH% echo March >>%_PATH% echo April >>%_PATH% echo May >>%_PATH% echo June >>%_PATH% echo July >>%_PATH% echo Augst >>%_PATH% echo September>>%_PATH% echo October >>%_PATH% echo November >>%_PATH% echo December >>%_PATH% set COUNT=1 for /f "delims=" %%m in (%_PATH%) do ( call :SetArrayValue %1 %%m call :Increment ) del /q %_PATH% >NUL 2>NUL goto :EOF :GetMargin set _PATH=_.bat echo set _MARGIN= 334455542333>%_PATH% echo set %2=%%_MARGIN:~%1,1%%>>%_PATH% call %_PATH% del %_PATH% >NUL 2>NUL goto :EOF :GetDayOfWeek set _Y4_PREV=%1 set _MM_PREV=%2 set _DOW=0 if %2 LEQ 2 ( set /a _Y4_PREV=%1-1 set /a _MM_PREV=%2+12 ) set /a _DOW=_Y4_PREV+_Y4_PREV/4-_Y4_PREV/100+_Y4_PREV/400+(13*_MM_PREV+8)/5+1 set /a %3=_DOW%%7 goto :EOF :GetSpace set _PATH=_.bat echo set _SPACE= >%_PATH% echo set %2=%%_SPACE:~0,%1%%>>%_PATH% call %_PATH% del %_PATH% >NUL 2>NUL goto :EOF :GetEndOfMonth set _PATH=_.bat echo set _DIFF=0030101001010>%_PATH% echo set /a %2=31-%%_DIFF:~%1,1%%>>%_PATH% call %_PATH% del %_PATH% >NUL 2>NUL goto :EOF :PrintCalendar set _DOW=0 set _SPACE=%3 set _LINE=%_SPACE:"=% set _DD=1 :LOOP_BEGIN if %_DD% GTR %1 goto LOOP_END set /a _DOW=(%_DD%+%2)%%7 if %_DD% LSS 10 set _DD= %_DD% set _LINE=%_LINE%%_DD% if %_DOW% EQU 0 ( echo %_LINE% set _LINE= ) set /a _DD+=1 goto LOOP_BEGIN :LOOP_END if "%_LINE%" NEQ "" echo %_LINE% goto :EOF :IsLeapYear set _VALUE=0 if %2 NEQ 2 goto :EOF set /a _VALUE=%1%%4 if %_VALUE% NEQ 0 goto :EOF set /a _VALUE=%1%%100 if %_VALUE% NEQ 0 set %3=1 && goto :EOF set /a _VALUE=%1%%400 if %_VALUE% EQU 0 set %3=1 && goto :EOF goto :EOFRating0/0=0.00-0+
2 replies [ reply ]