前回までのプログラム

前回はGet-FileInformationの枠組みに、Yesterday、LastOneWeek、ThisWeekといったオプションパラメータを追加しました。

ここまで来れば、さらにいろいろなオプションパラメータへの応用は簡単です。細部は違えど、基本的な考え方は同じだからです。今回は、さらにThisMonth(今月)とThisYear(今年)、LastOneMonth(直近1か月)、LastOneYear(直近1年)を追加しましょう。

前回までのプログラムの全体については、連載第25回を参照してください。

今月(ThisMonth)の範囲計算

今月の範囲...開始時間である1日0:00:00を求めるのは簡単です。

今日の0:00:00を求めるには、次のようにしていました。

Get-Date -Hour 0 -Minute 0 -Second 0

同様に-Dayオプションで日付を指定できます。

つまり、次の式で、今月1日の0:00:00を求めることができます。

Get-Date -Day 1 -Hour 0 -Minute 0 -Second 0

日付を1に指定した実行画面。

今月の範囲を計算する関数ThisMonthPeriodは次のようになります。

function ThisMonthPeriod
{
    Get-Date -Day 1 -Hour 0 -Minute 0 -Second 0
    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
    $date1.AddDays(1)
}

ThisMonthPeriodの実行結果。

今年の範囲計算

今年の範囲の計算は、今月の場合と全く同じパターンです。-Monthで月を指定できますので、今年の開始時刻である1月1日0:00:00を得るには、次のようにします。

Get-Date -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0

今年の元日を求める。

そこで、今年の範囲を計算する関数ThisYearPeriodは次のようになります。

function ThisYearPeriod
{
    Get-Date -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0
    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
    $date1.AddDays(1)
}

ThisYearPeriodの実行結果。

直近1か月の範囲計算

さて、前回作成したLastOneWeekPeriodと異なり、直近1か月はやや面倒です。月によって日数が異なりますので、単純に30日を引いても、実際の日付感覚に合わないからです。

たとえば、4月28日の1か月前...3月28日は、31日前です。しかし、5月28日の1か月前...4月28日は30日前です。閏年の問題も考えなければなりません。ここで便利なのがGet-Dateの-Monthオプションと、日付時刻型オブジェクトのMonthプロパティです。

ThisYearPeriodで使ったように、-Monthオプションを使えば、月だけ指定できます。また、パラメータを省略すると本日の日付時刻を元に日付時刻型オブジェクトを生成しますが、パラメータを指定すると、パラメータで指定した日付時刻オブジェクトを元に新しい日付時刻オブジェクトを生成します。

たとえば、次のようにすると、$dの日付時刻の月だけを11月にできます。

$d = Get-Date
Get-Date  $d  -Month  11

dに今日の日付を入れて、dの月を11に変更した値を得る。

一方、日付時刻型オブジェクトの月だけ得るのはMonthプロパティです。そこで、dが今日の日付時刻型オブジェクトのとき、以下の式で、1か月前の日付時刻オブジェクトを得ることができます。

Get-Date $d -Month ($d.Month - 1)

dが今日の日付(2011年4月28日)で、その1か月前の日付を得る。

この機能の便利なところは、5月31日の1か月前であれば4月30日、3月30日の1か月前であれば2月28日(閏年なら2月29日)というように、2月31日などのあり得ない日付にならないよう、自動的に月末の日付を調整してくれることです。

ただし、年を超すことはできません。たとえば、1月の1か月前を求めようと、Get-Dateの-Monthオプションに0(1月 -1)を指定するとはエラーになってしまいます。そこで、今月が1月の時だけは、前年の12月を算出する次の式になります。

Get-Date $d -Year ($d.Year -1) -Month 12

以上を踏まえて、直近1か月の範囲を算出する関数LastOneMonthPeriodは次のようになります。

function LastOneMonthPeriod
{
    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0 #今日の日付
    if ($date1.Month -ne 1)     # 今月が1月でないとき
    {
        Get-Date  $date1 -Month ($date1.Month - 1)    #月を1つ減じる
    }
    else
    {
      Get-Date $date1 -Year ($date1.Year -1) -Month 12  #前年の12月
    }
    $date1.AddDays(1)
}

LastOneMonthPeriodの実行画面。

直近1か月とは

直近1か月の範囲が何日から今日までか...というところについては、異論がある読者もいるでしょう。たとえば、本日が4月28日のとき、3月29日~4月28日が直近1か月かもしれません。3月28日~4月28日では、1か月+1日になります。

ただ、筆者の場合、前月の同日から...の方が使いやすいので、このようにしました。もし、前月の同日を範囲から外すのであれば、Get-Dateで1か月前の日付時刻オブジェクトを生成するとき、「今日の日付+1日」を-Dayオプションで指定します。ただし、今日が月末の場合は、-Dayで指定する日を1日とし、-Monthで月を指定しないようにしなければなりません(今月の1日だから)。末日の判定をどうするかが鍵となります。

余力のある読者は挑戦してみてください。

直近1年の範囲計算

前述の直近1か月の計算ができれば、直近1年は非常に単純です。単に前年の日付を求めればいいだけです。直近1年の範囲を求める関数LastOneYearPeridは次のようになります。

function LastOneYearPeriod
{
    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0   #今日の日付
    Get-Date  $date1  -Year ($date1.Year -1)
    $date1.AddDays(1)
}

LastOneYearPeriodの実行画面

今回までの全プログラム

これで、ThisMonthPeriod、LastOneMonthPeriod、ThisYearPeriod、LastOneYearPeriodができましたので、これらをGet-FileInformation.ps1に組み込み、パラメータオプションの評価、ヘルプ表示に、これらに対応する処理を追加します。

全プログラムは以下の通りです。

1:#ファイル情報一覧プログラム Ver.0.3
2:#オプション
3:# today
4:
5:#「今日」の開始日時と終了日時を算出
6:function TodayPeriod
7:{
8:  $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
9:  $date1
10: $date1.AddDays(1)
11:}
12:
13:#「昨日」の開始日時と終了日時を算出
14:function YesterdayPeriod
15:{
16:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
17:    $date1.AddDays(-1)
18:    $date1
19:}
20:
21:#「直近1週間」の開始日時と終了日時を算出
22:function LastOneWeekPeriod
23:{
24:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
25:    $date1.AddDays(-6)
26:    $date1.AddDays(1)
27:}
28:
29:#「今週」の開始日時と終了日時を算出
30:function ThisWeekPeriod
31:{
32:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
33:
34:    switch ($date1.DayOfWeek)
35:    {
36:    "Monday" { $date2 = $date1 }
37:    "Tuesday" { $date2 = $date1.AddDays(-1) }
38:    "Wednesday" { $date2 = $date1.AddDays(-2) }
39:    "Thursday" { $date2 = $date1.AddDays(-3) }
40:    "Friday" { $date2 = $date1.AddDays(-4) }
41:    "Saturday" { $date2 = $date1.AddDays(-5) }
42:    "Sunday" { $date2 = $date1.AddDays(-6) }
43:    default {} #処理不要
44:    }
45:    $date2
46:    $date1.AddDays(1)
47:}
48:
49:#「今月」の開始日時と終了日時を算出
50:function ThisMonthPeriod
51:{
52:    Get-Date -Day 1 -Hour 0 -Minute 0 -Second 0
53:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
54:    $date1.AddDays(1)
55:}
56:
57:#「今年」の開始日時と終了日時を算出
58:function ThisYearPeriod
59:{
60:    Get-Date -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0
61:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
62:    $date1.AddDays(1)
63:}
64:
65:#「この1か月」の開始日時と終了日時を算出
66:function LastOneMonthPeriod
67:{
68:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0 #今日の日付
69:    if ($date1.Month -ne 1)      # 今月が1月でないとき
70:    {
71:        Get-Date  $date1 -Month ($date1.Month - 1)    #月を1つ減じる
72:    }
73:    else
74:    {
75:      Get-Date $date -Year ($date1.Year -1) -Month 12  #前年の12月
76:    }
77:    $date1.AddDays(1)
78:}
79:
80:#「この1年」の開始日時と終了日時を算出
81:function LastOneYearPeriod
82:{
83:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0   #今日の日付
84:    Get-Date  $date1  -Year ($date1.Year -1)
85:    $date1.AddDays(1)
86:}
87:
88:
89:# $period  開始時間と終了時間を保持する配列変数
90:$helpmessage = $true # ヘルプを表示するかどうかのフラグ
91:
92:#オプションを確認d
93:for ($i = 0; $i -lt $args.length; $i++)
94:{
95: switch($args[$i])
96: {
97:     "Today" {       # 今日のファイル一覧を表示
98:         $helpmessage = $false
99:            $period = TodayPeriod
100:        }
101:        "Yesterday" {   # 昨日のファイルを一覧表示
102:            $helpmessage = $false
103:            $period = YesterdayPeriod
104:        }
105:        "LastOneWeek" { # 1週間のファイルを一覧表示
106:            $helpmessage = $false
107:            $period = LastOneWeekPeriod
108:        }
109:        "ThisWeek" { # 今週のファイルを一覧表示
110:            $helpmessage = $false
111:            $period = ThisWeekPeriod
112:        }
113:        "LastOneMonth" { # 1か月のファイルを一覧表示
114:            $helpmessage = $false
115:            $period = LastOneMonthPeriod
116:        }
117:        "ThisMonth" { # 今月のファイルを一覧表示
118:            $helpmessage = $false
119:            $period = ThisMonthPeriod
120:        }
121:        "LastOneYear" { # 1年のファイルを一覧表示
122:            $helpmessage = $false
123:            $period = LastOneYearPeriod
124:        }
125:        "ThisYear" { # 今年のファイルを一覧表示
126:            $helpmessage = $false
127:            $period = ThisYearPeriod
128:        }
129:        default {
130:            # 何もしません
131:        }
132:    }
133:}
134:
135:#ヘルプを表示するか、ファイル一覧を実行
136:if ($helpmessage)
137:{
138:    Write-Output "Get-FileInformation Ver.0.2 - ファイル一覧コマンド  "
139:    Write-Output ""
140:    Write-Output "使用方法"
141:    Write-Output "Get-FileInformation  <オプション>"
142:    Write-Output "オプション一覧"
143:    Write-Output "Today       -    今日のファイルを表示。"
144:    Write-Output "Yesterday   -    昨日のファイルを表示。"
145:    Write-Output "LastOneWeek -    1週間のファイルを表示。"
146:    Write-Output "ThisWeek    -    今週のファイル(月曜日以降)を表示。"
147:    Write-Output "LastOneMonth-    1か月のファイルを表示。"
148:    Write-Output "ThisMonth   -    今月のファイルを表示。"
149:    Write-Output "LastOneYear -    1年のファイルを表示。"
150:    Write-Output "ThisYear    -    今年のファイルを表示。"
151:} else {
152:    Get-ChildItem -Recurse | `
153:    Where-Object `
154:    { ($_.LastWriteTime -ge $period[0]) -and ($_.LastWriteTime -lt $    period[1]) }
155:}