前回までのプログラム

前回はGet-FileInformationの枠組みに、オプションパラメータtodayを指定したときの処理と、today指定しなかったときにヘルプメッセージを表示する処理を作成しました。これで、本日作成または変更したファイルとフォルダを一覧表示するプログラムとしては、ひとまずの機能が完成したと言えます。

今回は、yesterdayなどの他のオプションパラメーターを追加しましょう。

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

「昨日」の開始時間と終了時間を算出

まず、「昨日」の開始時間と終了時間を算出するプログラムを作成します。と言っても難しいことはありません。すでにTodayPeriodを作成しているので、TodayPeriodをちょっと修正するだけでYesterdayPeriodを作成できます。

14:function YesterdayPeriod
15:{
16:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
17:    $date1.AddDays(-1)
18:    $date1
19:}

実行結果。「今日」が2011年4月4日の場合。

16行目で、本日の0時0分0秒の日付時刻データを変数date1に代入します。

17行目で、「昨日」の開始日時として、本日の0時0分0秒の1日前の日付時刻データをパイプラインに出力します。AddDaysメンバ関数(メソッド)は、オブジェクトの日付時刻に指定した日数を加えますが、負の日数を指定することで、日数を減じることができます。 18行目で、「昨日」の終了時刻として、date1の値...つまり本日の0時0分0秒をパイプラインに出力します。

「この1週間」の算出

さて、ここまで来れば○日間などの応用は簡単です。yesterdayのついでに、本日を含む直近の1週間の開始日時と終了日時を求めるLastOneWeekPeriodを作成してみましょう。メンバ関数を使ってAddDays(-6)にすれば、6日前の日時を取得できます。直近の1週間の終了日時は「今日」の最後ですから、TodayPeriodと同様にAddDays(1)になります。

22:function LastOneWeekPeriod
23:{
24:    $date1 = Get-Date -Hour 0 -Minute 0 -Second 0
25:    $date1.AddDays(-6)
26:    $date1.AddDays(1)
27:}

実行結果。「今日」が2011年4月4日の場合。

「今週」の算出

「今週」の計算は、「この1週間」に比べると面倒です。単純に過去○日間というのではなく、曜日を考慮しなければならないからです。月曜日を週の始まりとして、直近の月曜日の0:00:00から、明日の0:00:00の直前までを「今週」と考えることにしましょう。

曜日は日付時刻型オブジェクトのDayOfWeekプロパティで得ることができます。たとえば、変数dに保存されている日付の曜日を得るには、$d.DayOfWeekとします。

日付時刻オブジェクトのDayOfWeekプロパティで曜日がわかります。

今週の初日(直近の月曜日)を計算するには、たとえば、今週が火曜日であれば、1日前が月曜日、水曜日であれば2日前が月曜日です。したがって、日付オブジェクト変数がdate1であれば、以下のプログラムでdate1から直近の月曜日の日付を計算してdate2に保存できます。

switch ($date1.DayOfWeek)
{
    "Monday" { $date2 = $date1 }
    "Tuesday" { $date2 = $date1.AddDays(-1) }
    "Wednesday" { $date2 = $date1.AddDays(-2) }
    "Thursday" { $date2 = $date1.AddDays(-3) }
    "Friday" { $date2 = $date1.AddDays(-4) }
    "Saturday" { $date2 = $date1.AddDays(-5) }
    "Sunday" { $date2 = $date1.AddDays(-6) }
    default {} #処理不要
}

date2からdate1(今日)の1日後の直前までが「今週」ということになります。

こうしたプログラムが正しく動作するかどうか確認するときは、Windows PowerShell ISEを使って、簡単に実験できます。スクリプトペインに入力し、F5キー押して(または[スクリプトを実行]ボタンをクリックして)プログラムを実行します。その際、条件を変化させながら何度も実行すれば、期待通りの結果が得られるかどうか、より正確に判定できます。

上記のプログラム例で言えば、始めに、

$date1 = (Get-Date).AddDays(0)

の1行を挿入、最後に結果を表示する$date2、$date1.AddDays(1)を追加してから、最初のAddDays(0)の0の部分を変化させてdate1の日付を変更することで、date1がどの曜日であっても期待した結果を得られるかどうかテストできます。

実行例。本来date1に「今日」の日付を代入するのですが、AddDaysを使って「今日」を前後に変更してテストします。

以上を踏まえて、今週の範囲を計算する関数 ThisWeekPeriod は以下の通りです。

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:}

オプションパラメータの評価

Get-FileInformationの実質的なメインプログラムである、オプションパラメータを評価するswitch構文に、今回作成したYesterday、LastOneWeek、ThisWeekを追加します。

55:for ($i = 0; $i -lt $args.length; $i++)
56:{
57: switch($args[$i])
58: {
59:        "Today" {       # 今日のファイル一覧を表示
60:            $helpmessage = $false
61:            $period = TodayPeriod
62:     }
63:        "Yesterday" {   # 昨日のファイルを一覧表示
    64:            $helpmessage = $false
65:            $period = YesterdayPeriod
66:        }
67:        "LastOneWeek" { # 1週間のファイルを一覧表示
68:            $helpmessage = $false
69:            $period = LastOneWeekPeriod
70:        }
    71:        "ThisWeek" { # 今週のファイルを一覧表示
72:            $helpmessage = $false
73:            $period = ThisWeekPeriod
74:        }
75:   default {
    76:     # 何もしません
77:   }
78: }
79:}

63行目~74行目が、今回追加した部分です。

ヘルプメッセージの追加

今回の最後に、ヘルプメッセージのオプションパラメータ一覧に、yesterdayとlastoneweekを追加します。前回作成したtodayオプションパラメータの次行に追加してください。今回、読みやすいようにオプションパラメータを大文字小文字混じりの記述に変更しました。

84:    Write-Output "Get-FileInformation Ver.0.2 - ファイル一覧コマンド"
85:    Write-Output ""
86:    Write-Output "使用方法"
87:    Write-Output "Get-FileInformation  <オプション>"
88:    Write-Output "オプション一覧"
89:    Write-Output "Today       -    今日のファイルを表示。"
90:    Write-Output "Yesterday   -    昨日のファイルを表示。"
91:    Write-Output "LastOneWeek -    1週間のファイルを表示。"
92:    Write-Output "ThisWeek    -    今週のファイル(月曜日以降)を表示。"

今回までの全プログラム

以下に、今回までの修正を加えた全プログラムリストを掲載します。このプログラムで、追加した各種オプションパラメータに対応できます。

1:#ファイル情報一覧プログラム Ver.0.2
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:
51:# $period  開始時間と終了時間を保持する配列変数
52:$helpmessage = $true # ヘルプを表示するかどうかのフラグ
53:
54:#オプションを確認
55:for ($i = 0; $i -lt $args.length; $i++)
56:{
57:    switch($args[$i])
58:    {
59:        "Today" {       # 今日のファイル一覧を表示
60:            $helpmessage = $false
61:            $period = TodayPeriod
62:        }
63:        "Yesterday" {   # 昨日のファイルを一覧表示
64:            $helpmessage = $false
65:            $period = YesterdayPeriod
66:        }
67:        "LastOneWeek" { # 1週間のファイルを一覧表示
68:            $helpmessage = $false
69:            $period = LastOneWeekPeriod
70:        }
71:        "ThisWeek" { # 今週のファイルを一覧表示
72:            $helpmessage = $false
73:            $period = ThisWeekPeriod
74:        }
75:        default {
76:            # 何もしません
77:        }
78:    }
79:}
80:
81:#ヘルプを表示するか、ファイル一覧を実行
82:if ($helpmessage)
83:{
84:    Write-Output "Get-FileInformation Ver.0.1 - ファイル一覧コマンド"
85:    Write-Output ""
86:    Write-Output "使用方法"
87:    Write-Output "Get-FileInformation  <オプション>"
88:    Write-Output "オプション一覧"
89:    Write-Output "Today       -    今日のファイルを表示。"
90:    Write-Output "Yesterday   -    昨日のファイルを表示。"
91:    Write-Output "LastOneWeek -    1週間のファイルを表示。"
92:    Write-Output "ThisWeek    -    今週のファイル(月曜日以降)を表示。"
93:} else {
94:    Get-ChildItem -Recurse | `
95:    Where-Object `
96:    { ($_.LastWriteTime -ge $period[0]) -and ($_.LastWriteTime -lt $p    eriod[1]) }
97:}