前回たでのプログラムで、怜玢するファむルの期間を蚭定するパタヌンをいろいろ䜜成しおみたした。だいたいのパタヌンは把握できたず思いたす。さらにいろいろな期間をオプションずしお蚭定したいのであれば、前回たでのプログラムを参考にバリ゚ヌションを増やすこずはそう難しいこずではありたせん。

今回は別のタむプのオプションを加えたいず思いたす。

前回たで䜜成したGet-FileInformation.ps1では、オプションパラメヌタTodayやThisWeekなどの期間を指定できるようにしたした。ただ、垞にカレントディレクトリ以䞋のすべおのディレクトリ(フォルダ)を怜玢したすので、目的によっおはかえっお無駄に情報を衚瀺するこずになりたす。むしろ邪魔になるこずもありたす。

そこで、今回は、スむッチパラメヌタを指定しお、カレントディレクトリだけ怜玢、サブディレクトリも怜玢、ず切り替えられるようにしおみたす。

仕様ずしおは、Get-FileInformation.ps1実行時に-rオプション(recurseのr)を指定したらサブディレクトリも怜玢、-rの指定がなければカレントディレクトリだけ怜玢するずしたす。

-rず入力しおも、-recurseず入力しおもいいように、最初の2文字-rだけを刀定し、3文字目以降はあっおもなくおもいいずしたす。(最初が-rであれば-raaでも-r1234でもOK)

パタヌンマッチングの基本

パタヌンマッチングずは、文字列のパタヌンを比范し、条件に合っおいるか、条件に合わないかを刀定するこずです。たずえば、Get-FileInfomation.ps1のswitch構文で"Today"、"Yesterday"などの文字列をチェックしおいるのも、パタヌンマッチングの䞀皮ず蚀えたす。ただし、今たで䜜成したswitch構文では、単玔に同じ文字列かどうかを刀定するだけです。

PowerShellでは、より本栌的なパタヌンマッチングを行う手段ずしお、-likeず-matchずいう挔算子がありたす。

-likeの基本的な䜿い方は、以䞋の匏になりたす。

比范察象ずなる文字列 -like  パタヌン指定文字列

「比范察象文字列」が「パタヌン指定文字列」が意味するパタヌンに適合すれば、この匏の倀が真(true)になりたす。適合しなければ停(false)になりたす。-match挔算子の堎合も基本的には同じ䜿い方です。ただし、パタヌン指定文字列を蚘述するずき、-likeの堎合には、ワむルドカヌドず呌ぶDOSやWindows流の曞匏を䜿いたすが、-matchの堎合には正芏衚珟ず呌ぶUNIX流の曞匏を䜿いたす。-likeの方がシンプルで簡単に䜿いこなせるようになりたすが、-matchの方がより耇雑で现かなパタヌン指定が可胜です。

今回は、簡単に䜿甚できるワむルドカヌドの-likeを解説したす。

ワむルドカヌドで䜿甚する特殊文字は2぀、アスタリスク「*」ずク゚スチョンマヌク「?」です。必ず半角文字で指定したす。アスタリスクは「0文字以䞊の任意の文字列」を意味したす。「?」は「任意の1文字」を意味したす。

たずえば、「a?b」は、「aずbの間に任意の1文字がある」こずを意味したす。abbやa5bは適合したすが、abはaずbの間に1文字ありたせんので適合したせん。たたa12bはaずbの間に2文字ありたすので、適合したせん。

「a*b」は、「aずbの間に0文字以䞊の任意の文字列がある」こずを意味したす。泚意が必芁なのは、1文字以䞊ではなく、0文字以䞊であるこずです。たずえば、「ab」はaずbの間が0文字ですので適合したす。a1bもa123bもa123456bも適合したす。しかし、a123bcは、文字列の最埌がcですので適合したせん。「a*b*」(aで始たっお任意の文字列があっおbがあっお任意の文字列)ずすれば適合したす。

ワむルドカヌドの䜿い方がわかれば、-rで始たるスむッチパラメヌタかどうかを刀定するパタヌンが「-r*」であるこずがわかりたす。

実際に-likeで詊しおみたしょう。以䞋のプログラムを入力しお実行しおみおください。

if ("-recurse" -like "-r*")
{
    Write-Output "適合せり"
} else {
    Write-Output "適合せず"
}

-like挔算子を䜿っお、ワむルドカヌドのパタヌンマッチングを詊しおみたす。

「適合せり」ず衚瀺されるはずです。"-recurse"の郚分や"-r*"の文字列郚分を、いろいろ倉曎しお実行し、詊しお䞋さい。

吊定するマッチ挔算子

-likeや-matchによるマッチングの排他挔算子ずしお-nolikeや-nomatchがありたす。たずえば、「-nolike "ab*"」は、「ab*に該圓しない文字列」を意味したす。

switch構文の拡匵

switch構文の基本的な䜿い方を埩習したしょう。構文は以䞋の通りです。

switch (比范される倀)
{
    倀1  {
        比范される倀が倀1だったずきの凊理
    }
    倀2  {
        比范される倀が倀2だったずきの凊理
    }
        :
    default  {
        比范される倀がどの倀にも䞀臎しなかったずきの凊理
    }
}

通垞、比范される倀は、完党に䞀臎するかどうかで刀定したすが、実は、PowerShellのswitchにはパタヌンマッチング機胜もありたす。それを䜿えば、-like挔算子のようなマッチング凊理をできたす。

ワむルドカヌドで刀定するためには、switch構文の冒頭を、以䞋のように蚘述したす。

switch  -wildcard  (比范される倀)

正芏衚珟で刀定するためには-wildcardの代わりに-regexを指定したす。

なお、-wildcardも-regexも、比范される倀が文字列でなければ意味のない機胜です。比范される倀が文字列型以倖の時は-wildcardや-regexを指定しおも意味をなしたせん。PowerShellは無芖したす。

远加するプログラムの抂芁

今回の-rスむッチパラメヌタずその機胜を远加するための、Get-FileInformation.ps1の倉曎のポむントは次の通りです。

※ 党プログラムリストは、この蚘事の末尟に掲茉しおいたす。

(1)コマンドラむンオプションを怜査するforルヌプに入る前に、サブディレクトリも怜玢するかどうかを保存するフラグ、recurseflagを甚意したす。その初期倀をfalseに蚭定したす(プログラムリストの89行目)。

recurseflagの倀がfalse(停)のたたであれば、サブディレクトリを怜玢したせん。

recurseflagの倀がtrue(真)になれば、サブディレクトリを怜玢したす。

このrecurseflagのように、凊理の分岐点の信号ずなる倉数を、プログラムではフラグ(旗)ず呌びたす。

87:# $period  開始時間ず終了時間を保持する配列倉数
88:$helpmessage = $true # ヘルプを衚瀺するかどうかのフラグ(初期倀true)
89:$recurseflag = $false  # サブディレクトリも怜玢するかどうかのフラグ(初期倀false)

(2)ワむルドカヌドを䜿ったマッチング刀定をしたすので、switchには-wildcard指定を付けたす。(94行目)

92:for ($i = 0; $i -lt $args.length; $i++)
93:{
94: switch -wildcard ($args[$i])
95: {

(3)コマンドラむンオプションを刀定するforルヌプのswitch構文の䞭で、コマンドラむンパラメヌタに"-r"で始たる文字列があればrecurseflagの倀をtrueにセットしたす。ここでパタヌンマッチングのためのワむルドカヌド蚘述を䜿甚したす。(129行目131行目)

129:        "-r*" {
130:            $recurseflag = $true
131:        }

(3)Get-ChildItemコマンドレットを実行する段階で、recurseflagがtrueであれば、-Recurseオプション付きで、recurseflagがfalseであれば-Recurseオプションなしで、Get-ChildItemを実行したす。(159行目167行目)

159:    if ($recurseflag -eq $true) {   # -r付き
160:        Get-ChildItem -Recurse | `
161:        Where-Object `
162:        { ($_.LastWriteTime -ge $period[0]) -and ($_.LastWriteTime -    lt $period[1]) }
163:    } else {          # -r なし
164:        Get-ChildItem | `
165:        Where-Object `
166:        { ($_.LastWriteTime -ge $period[0]) -and ($_.LastWriteTime -    lt $period[1]) }
167:    }

(4)ヘルプ衚瀺に-rスむッチパラメヌタの説明を远加したす。(156行目157行目)

156:    Write-Output ""
157:    Write-Output "-r          -    サブディレクトリも怜玢。"

Get-FileInformation Yesterdayず実行した䟋。昚日䜜成したカレントディレクトリのファむルだけを䞀芧衚瀺したす。

Get-FileInformation Yesterday -r ず実行した䟋。サブディレクトリも含めお怜玢したす。

ファむル情報䞀芧プログラムのたずめ

さお、ただただ改良の䜙地はありたすが、ひずたず、Get-FileInformation.ps1のプログラミングは今回で区切りを付けるこずにしたす。

Get-FileInformation.ps1では、実行時に指定されたコマンドラむンの凊理、文字列配列の扱い、日付時刻型オブゞェクトの蚈算、for構文やswitch構文、if構文、そしお文字列パタヌンマッチングなどを䜿いたした。

次回からは、たた違ったプログラムを取り䞊げおいきたす。

ファむル情報䞀芧プログラムの党プログラムリスト

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