PowerShellでは、カレンダーを表示するコマンドレットがないので自作してみました。
紹介する関数(Get-Calendar)は
指定した年月の最終日を取得する(PowerShell Tips)
指定した年月の第1日曜日を取得する(PowerShell Tips)
が必要です。
実行イメージは下記のとおり
Get-Calendar.ps1
#===============================================================================
# Get-Calendar: 指定した年月のカレンダーを表示する
#
# パラメータ:
# $Year: 年(省略した場合は現在の年)
# $Month: 月(省略した場合は現在の月)
#
# 使用例1(年月指定)
# PS > Get-Calendar 2008 2
#
# 使用例2(年月省略)
# PS > Get-Calendar
#
# copyright HIRO's.NET(http://hiro.wankuma.com/)
#===============================================================================
function global:Get-Calendar
{
Param ([int]$Year = $(Get-Date).Year, [int]$Month = $(Get-Date).Month)
#表示用年月作成
$DispMonth = New-Object DateTime($Year, $Month, 1)
$strDispMonth = ($DispMonth.ToString("MMMM",[System.Globalization.CultureInfo]'en-US') + " " + $Year)
#横幅35文字の中間に表示されるようにする
Write-Host ""
Write-Host $strDispMonth.PadLeft([int](35 - (35 - $strDispMonth.Length) / 2))
$firstSunday = Get-FirstSunday $Year $Month
$lastDay = Get-LastDay $Year $Month
Write-Host "Sun. Mon. Tue. Wed. Thu. Fri. Sat."
# 第1日曜日が"1日"以外の第1週を表示
if ( $firstSunday -ne 1 )
{
for ( $i = 1; $i -lt $firstSunday; $i++ )
{
$week += $i.ToString(" # ");
}
$spc = " "
$spc *= [int](7 - ( $firstSunday - 1 ))
Write-Host ($spc + $week)
}
#中間週を表示
$loopWeek = [Math]::floor(($LastDay - $firstSunday) / 7)
$Day = $firstSunday
for ( $weekCnt = 0; $weekCnt -lt $loopWeek; $weekCnt++ )
{
$week = "";
for ( $iDay = 0; $iDay -lt 7; $iDay++ )
{
if ( $Day -lt 10 ) { $week += $Day.ToString(" # "); }
else { $week += $Day.ToString(" ## "); }
$Day += 1
}
Write-Host ($week)
}
#最終週を表示
if ( $Day -le $LastDay )
{
$week = ""
for ( $iDay = $Day; $iDay -le $LastDay; $iDay++ )
{
$week += $Day.ToString(" ## ");
$Day += 1
}
Write-Host ($week)
}
}
ポイント
1.タイトル(年月)の表示
「月」を英語で表示したかったので、ToString("MMMM")としましたが、”2月”と返ってくるので
ToString("MMMM",[System.Globalization.CultureInfo]'en-US') として英語で取得しています。
カレンダーを表示するのに必要な幅は35文字としています。
これは1日を5文字使用して表示しているので、× 7日 = 35文字となっています。
でタイトルは中心に表示したいので、計算して左側にスペースを入れています。(PadLeftメソッド)
2.カレンダーの表示
表示は第1週、中間週、最終週の3つに分けて行っています。
これは、第1週が必ずしも日曜日から始まるとは限らないこと、最終週が必ずしも土曜日で終わるとは限らないことを考慮したためです。
もうちょっとスマートに書けると良いんですが、これくらいの技量しかないので...
アドバイス等ありましたら、よろしくお願いします。