HIRO's.NET Blog

PowerShellが好き

目次

Blog 利用状況

ニュース

あわせて読みたい

書庫

日記カテゴリ

リンク

指定した年月のカレンダーを表示する(PowerShell Tips)

PowerShellでは、カレンダーを表示するコマンドレットがないので自作してみました。

紹介する関数(Get-Calendar)は

指定した年月の最終日を取得する(PowerShell Tips)

指定した年月の第1日曜日を取得する(PowerShell Tips)

が必要です。

 

実行イメージは下記のとおり

Get-Calendar

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週が必ずしも日曜日から始まるとは限らないこと、最終週が必ずしも土曜日で終わるとは限らないことを考慮したためです。

 

もうちょっとスマートに書けると良いんですが、これくらいの技量しかないので...

アドバイス等ありましたら、よろしくお願いします。



 

投稿日時 : 2008年2月21日 11:39

コメントを追加

# re: 指定した年月のカレンダーを表示する(PowerShell Tips) 2008/02/21 21:11 牟田口大介

WSHですが以前こんなのを作りました。

http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh07/cformwsh07_03.html

月初めのオフセットだけ考慮して、一ヶ月は6週と決め打ちしています。
そのため空白行とかできるかもですがカレンダー的にはこちらが正しいのかなとも思います。
あとは面倒なのでtabで。

# re: 指定した年月のカレンダーを表示する(PowerShell Tips) 2008/02/21 21:38 HIRO

>牟田口さん
ありがとうございます。

なるほどですね。
1週目と最終週の中途半端な部分をどうするか悩んだ末3ブロックに分けました。

6週として計算するのはコードがスッキリしていて良いですね。


土曜日は青、日曜日は赤にしてみようかとも思ったのですが、Write-Hostを使用すると、改行が入ってしまうため断念しました....

# re: 指定した年月のカレンダーを表示する(PowerShell Tips) 2008/02/22 7:35 牟田口大介

write-host -NoNewlineが使えると思いますよー

# re: 指定した年月のカレンダーを表示する(PowerShell Tips) 2008/02/22 12:28 HIRO

>牟田口さん
ありがとうございます。

ヘルプ確認したら、ありますね、 -NoNewline
恥ずかしい...

勉強になりました

# 指定した年月のカレンダーを表示する(GUI版) (PowerShell Tips) 2008/02/22 16:57 HIRO's.NET Blog

指定した年月のカレンダーを表示する(GUI版) (PowerShell Tips)

# re: 指定した年月のカレンダーを表示する(PowerShell Tips) 2008/02/24 23:36 嗣永モモコーラ

ご存知かもしれませんが、ちょうどいま行われている2008 Winter Scripting Gamesで同じような課題が出てました。

http://www.microsoft.com/technet/scriptcenter/funzone/games/solutions08/expssol04.mspx
Microsoftの方による回答の一例はこんな感じのようです。

# 指定した年月のカレンダーを表示する その2(PowerShell Tips) 2008/03/03 16:56 HIRO's.NET Blog

指定した年月のカレンダーを表示する その2(PowerShell Tips)

タイトル  
名前  
URL
コメント