コマンド名はWEEKLISTとしました。
パラメータは、 年月(年=yyyy, 年月=yyyyMM)と 曜日(0=日,1=月,2=火,3=水,4=木,5=金,6=土 ※数値も日本語名どちらも可)の2つを指定するようにしました。
たとえば、2014年2月の土曜日の日付リストが欲しければ
WEEKLIST 201402 土 (WEEKLIST 201402 6でも可)
とすれば、結果が画像のように返ってきます。
パラメータの年月部分に年だけ指定すれば、一気に指定年の一覧が出力される仕組みになっています。
これを見ると、冒頭の家族からの質問にもすぐに答える事が出来るかなーと。
参考までに
PowerShellを使えるように設定する記事はこちらです
■コマンドのコード内容
ちなみに、作りながら試して知ったのですが、PowerShellって、C#言語のようにジェネリッククラスのlistが使えるんですね。
$gREC = $(NEW-OBJECT System.Collections.Generic.List[string]);
で初期化しといて・・・
$gREC.Add(値);
で値を追加出来るんですね。
ちなみに、[void]$oREC.Add(値);のように[void]でコマンド画面への出力を抑制する必要は無かったです。
#曜日ベースの日付リスト表示 FUNCTION GLOBAL:WEEKLIST($P_DATE="",$P_WEEK="") { $iMODE = [int16]0; #処理モード $iWEEK = [int16]0; $iCURRENT = [int16]0; #カレント週 $i = [int32]1; #曜日週数初期化 $iBREAK_KEY = [int32]-1; #ブレイクキーエリア $iEND_KEY = [int32]-1; #終了値 $iEND = [int16]0; #終了フラグ $oRX1 = $(NEW-OBJECT Regex("^[0-9]{4}$")); $oRX2 = $(NEW-OBJECT Regex("^[0-9]{6}$")); $oRX3 = $(NEW-OBJECT Regex("^[0-6]{1}|日|月|火|水|木|金|土$")); $oDUMMY = $(NEW-OBJECT DateTime); #日付チェック用 $iDUMMY = [int32]0; #数値チェック用 $sDATE = [String]$P_DATE; #処理開始日エリア初期化 $sREC = ""; #出力用情報エリア #出力オブジェクト(ジェネリッククラスによる動的文字列型配列) $gREC = $(NEW-OBJECT System.Collections.Generic.List[string]); if($oRX1.IsMatch($P_DATE)) { $iMODE = 1; #年モード $sDATE = $sDATE + "-01-01"; #処理開始日セット } elseif($oRX2.IsMatch($P_DATE)) { $sDATE = $sDATE.SubString(0,4) + "-" + $sDATE.SubString(4,2) + "-01"; #入力年月が正当かどうかチェック if(![DateTime]::TryParse($sDATE,[ref]$oDUMMY)) { WRITE-OUTPUT ("入力された年月が不正です。"); RETURN; #強制終了 } $iMODE = 2; #年月モード } if($iMODE -eq 0 -or !$oRX3.IsMatch($P_WEEK)) { WRITE-OUTPUT ("パラメータは 年月(年=yyyy, 年月=yyyyMM) 曜日(0=日,1=月,2=火,3=水,4=木,5=金,6=土 ※数値も日本語名どちらも可)"); RETURN; #強制終了 } #曜日パラメータの取得 if([int16]::TryParse($P_WEEK,[ref]$iDUMMY)) { #曜日が数値の場合はそのまま取得 $iWEEK = [int16]$P_WEEK; } else { #日本語名の場合は自作関数で数値に変換 $iWEEK = [int16](WEEKNAME $P_WEEK); } $aDATE = $sDATE.Split("-"); #日付の年月日要素分解 $oDATE = $(NEW-OBJECT DateTime($aDATE[0],$aDATE[1],$aDATE[2])); $iEND_KEY = $oDATE.Year*100 + $oDATE.Month; #終了年月セット #@@@@@@@@@@[LOOP-START]@@@@@@@@@@ while($iEND -eq 0) #終了フラグが0の間はループ { $iCURRENT = [int16]($oDATE.DayOfWeek.ToString("d")); #カレント曜日 if($iCURRENT -eq $iWEEK) { $sREC = $oDATE.Year.ToString("0000") + "年,"; $sREC+= $oDATE.Month.ToString("00") + "月,"; #自作関数で曜日数値を曜日名に変換 $sREC+= "第" + $i.ToString() + (WEEKNAME $iCURRENT) + "曜日,"; $sREC+= $oDATE.ToString("yyyy-MM-dd"); #WRITE-OUTPUT ($sREC); $gREC.Add($sREC); #出力リストに追加 $i++; #曜日週数のカウントアップ } $oDATE = $oDATE.AddDays(1); #1日日付をアップ if($iMODE -eq 1) { #年モード時 if($oDATE.Year -ne [Math]::floor($iEND_KEY/100)) { #年がキー・ブレイクしたら終了 $iEND = 1; } else { if($oDATE.Year*100+$oDATE.Month -ne $iBREAK_KEY) { #年月がキー・ブレイク時 $sREC = "-----,-----,-----,-----"; $gREC.Add($sREC); $i = 1; #曜日週数の初期化 $iBREAK_KEY = $oDATE.Year*100+$oDATE.Month; } } } else { #年月モード if($oDATE.Year*100+$oDATE.Month -ne $iEND_KEY) { #年月がキー・ブレイクしたら終了 $iEND = 1; } } } #@@@@@@@@@@[LOOP-END ]@@@@@@@@@@ #出力 RETURN $gREC; } FUNCTION GLOBAL:WEEKNAME($P_VALUE="") { $sRES = ""; switch($P_VALUE) { "0" {$sRES = "日"; } "1" {$sRES = "月"; } "2" {$sRES = "火"; } "3" {$sRES = "水"; } "4" {$sRES = "木"; } "5" {$sRES = "金"; } "6" {$sRES = "土"; } "99" {$sRES = "ALL";} "日" {$sRES = "0"; } "月" {$sRES = "1"; } "火" {$sRES = "2"; } "水" {$sRES = "3"; } "木" {$sRES = "4"; } "金" {$sRES = "5"; } "土" {$sRES = "6"; } "ALL"{$sRES = "99"; } default{$sRES="?"; } } RETURN $sRES; }このコードはさすがにちょっとだけ長かったんで、マイクロソフトウェッジモバイルキーボードを接続して入力しましたー。
このキーボード本当に入力しやすい!!!!