日付オブジェクトのプロパティ
Get-Dateコマンドレットで取得できる日付のオブジェクト(System.DateTime)には、主に次のプロパティが設定されている。
| プロパティ名 | 内容 |
|---|---|
| Date | 年月日時分秒など |
| Day | 日 |
| DayOfWeek | 曜日 |
| DayOfYear | 1年で何日目か |
| Hour | 時 |
| Kind | UTCやLocalなど |
| Millisecond | ミリ秒 |
| Minute | 分 |
| Month | 月 |
| Second | 秒 |
| Ticks | 基準日付から100ナノ秒単位での刻み値 |
| TimeOfDay | 時分秒など |
| Year | 年 |
日付オブジェクトから個々の値を取り出す場合にはこうしたプロパティが利用できる。
日付オブジェクトのプロパティにアクセスした場合のサンプル
PS /Users/daichi> $d = Get-date
PS /Users/daichi> $d.Day
26
PS /Users/daichi> $d.DayOfWeek
Tuesday
PS /Users/daichi> $d.DayOfYear
177
PS /Users/daichi> $d.Hour
15
PS /Users/daichi> $d.Millisecond
966
PS /Users/daichi> $d.Minute
10
PS /Users/daichi> $d.Month
6
PS /Users/daichi> $d.Second
57
PS /Users/daichi> $d.Year
2018
PS /Users/daichi>
Get-Dateコマンドレットで取得できるオブジェクトはSystem.DateTimeという型のオブジェクトだ。PowerShellはシェルスクリプトのように利用できるが、実際にはオブジェクト指向プログラミング言語の機能を備えており、やり取りされているデータはテキストデータではなくオブジェクトになっている。
このあたりは細かく説明してもよくわからなくなってくると思うので、今後いろいろ取りあげる動作例を通じてなんとなく感覚を掴んでいってもらえればと思う。
日付オブジェクトのメソッド
Get-Dateコマンドレットで取得できるオブジェクトはSystem.DateTime型だ。この型には主に次のようなメソッドが用意されている。加算や減算、ほかの型への変換機能などが用意されている。
| メソッド | 内容 |
|---|---|
| Add | timespan値を加算 |
| AddDays | 日を加算 |
| AddHours | 時を加算 |
| AddMilliseconds | ミリ秒を加算 |
| AddMinutes | 分を加算 |
| AddMonths | 月を加算 |
| AddSeconds | 秒を加算 |
| AddTicks | チックを加算 |
| AddYears | 年を加算 |
| CompareTo | 比較 |
| Equals | 等価演算 |
| GetDateTimeFormats | 指定可能なフォーマット一覧を表示 |
| GetHashCode | ハッシュコード取得 |
| GetType | 型情報を取得 |
| GetTypeCode | タイプコードを取得 |
| IsDaylightSavingTime | 夏時間かどうか |
| Subtract | 引き算 |
| ToFileTime | ファイルタイム(long)に変更 |
| ToFileTimeUtc | ファイルタイム(long, UTC)に変換 |
| ToLocalTime | ローカルタイムに変換 |
| ToLongDateString | 日付文字列(長い)に変換 |
| ToLongTimeString | 時刻文字列(長い)に変換 |
| ToShortDateString | 日付文字列(短い)に変換 |
| ToShortTimeString | 時刻文字列(短い)に変換 |
| ToString | 指定したフォーマットの文字列に変換 |
| ToUniversalTime | UTC時間に変換 |
たとえば、addDays()メソッドを使って日付データを1週間増やすとすれば、次のように操作すればよいことになる。
日付を1週間進める場合の操作例
PS /Users/daichi> $d
Tuesday, 26 June 2018 15:10:57
PS /Users/daichi> $d.addDays(7)
Tuesday, 3 July 2018 15:10:57
PS /Users/daichi>
次に、日付がある一定の期間内にあるかどうかを判断する場合を考える。判断するにあたって先にPowerShell Coreで利用できる論理演算子と比較演算子を知っておく必要があるので、次にまとめておく。
| 論理演算子 | 意味 |
|---|---|
| -and | 論理積 |
| -or | 論理和 |
| -xor | 排他的論理和 |
| -not | 否定 |
| ! | 否定 |
| 比較演算子 | 意味 |
|---|---|
| -eq | 等価 |
| -ne | 等価ではない |
| -gt | 大なり |
| -ge | 大なりイコール |
| -lt | 小なり |
| -le | 小なりイコール |
| -like | ワイルドカードマッチ |
| -notlike | ワイルドカードマッチしない |
| -match | 正規表現マッチ |
| -notmatch | 正規表現マッチしない |
| -contains | コレクションに参照値が含まれている |
| -notcontains | コレクションに参照値が含まれていない |
| -in | コレクションにテスト値が含まれている |
| -notin | コレクションにテスト値が含まれていない |
| -replace | 文字列パターンを置換 |
| -is | オブジェクトが同じ型 |
| -isnot | オブジェクトが同じ型ではない |
JavaやC/C++、Pythonといったプログラミング言語に慣れているなら&&、||、!、<、<=、>、>=などの演算子を知っていると思うが、上記演算子はそれと似たような働きをする。UNIX系コマンドのtestでは上記のようにハイフンからはじまる論理演算子や比較演算子を利用するのだが、それとよく似ている。
こうした機能を使って日付データを比較すると次のようになる。
日付演算の例
PS /Users/daichi> $start=(Get-Date -Format yyyy/MM/dd 2018/01/01)
PS /Users/daichi> $end=(Get-Date -Format yyyy/MM/dd 2018/01/10)
PS /Users/daichi> $a=(Get-Date -Format yyyy/MM/dd 2017/12/30)
PS /Users/daichi> $b=(Get-Date -Format yyyy/MM/dd 2018/01/03)
PS /Users/daichi> $c=(Get-Date -Format yyyy/MM/dd 2018/02/03)
PS /Users/daichi> $start
2018/01/01
PS /Users/daichi> $end
2018/01/10
PS /Users/daichi> $a
2017/12/30
PS /Users/daichi> $b
2018/01/03
PS /Users/daichi> $c
2018/02/03
PS /Users/daichi> ($start -le $a) -and ($a -le $end)
False
PS /Users/daichi> ($start -le $b) -and ($b -le $end)
True
PS /Users/daichi> ($start -le $c) -and ($c -le $end)
False
PS /Users/daichi>
$startと$endの間に収まっている日付データだけがTrueと判断されていることを確認できことがわかる。こんな感じで日付の演算が可能というわけだ。
まだコマンドの使い方に留まっているのでプログラミング的なサンプルは掲載しないが、制御構文を使えばログデータを解析して指定した期間内のログデータだけを取り出すといったこともできるようになる。そのあたりまでできるようになれば入門の範囲では上出来だ。