-Section 4 ー 60 { 社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし 56 64 65 68 69 70 71 72 76 84 88 89 90 93 } 94 sel ect group UserName Date 83 $data ー " は削除します。 82 # 初期値 " 99 : 99 : 99 " と " 81 # 1 日ごとの初回ログオン、最終ログオフ時刻を抽出します。 0ffT ime= (CDateT ime] $ ー T imeGenerated) . ToStr i ng ("HH:m: ss") UserName = $matches [ 1 ] , " \ \ (. * ) がログオフ " ) { i f ( $ ー Message -match OnT ime= ([DateT ime] $ ー T imeGenerated) . ToStr i ng("HH:m ・ ss") UserName = $matches [ 1 ] , " \ \ (. * ) がログオン " ) { if ( $ ー Message -match # 正規表現でユーザー ID 部分を抽出します。 Date (CDateTime] $ ー T imeGenerated) . TOStr i ng ("yyyy/MM/dd") ; Last0ff 0ffT i me F i rst0n = " 99 : 99 : 99 " ・ Date 0nTime ー " 99 : 99 : 99 " ・ # 後の工程を考慮した初期値を入れておきます。 $data ー Add-Member -NotePropertyMembers @{ ipcsv $src $data 59 funct ion processCsv ($src) 58 # 必要な情報のみを抽出し、 CSV を上書きします 57 # CSV の成型加工を行う関数 @{Name="Date" Express ion- { ( $ ー group @{Name="F i rstOn" ・ Expression={(( $ ー group @{Name-"LastOff" Expression-{(( $ ー group @{Name="UserName ・・ Expression-{( $ group epcsv $src -Encod i ng UTF8 measure —max Date ) . Max imum) } measure —min OnTime ) M i n i mum) " 99 : 99 : 99 —replace —replace measure —max UserName ) . Max imum} } measure -max OffT ime ) . Max imum) [ 図 4-16 ] 「ログオン・ログオフ集計 . p 引」 CSV 加工処理部分 CSV 加工を行う関数が「 processCsv 」一図 4 ー 16 Ⅱ 59 行目 ~ ) です。まず最初に 1 日ごとの初回 ログオン、最終ログオフ時刻を格納する「 FirstOn 」「 LastO 列を追加しています。この際のデフォ ルト値ですが、 83 行目以降で「 FirstOn 」の最小値、「 LastOff 」の最大値を選ぶ際にデフォルト値 が選ばれてはいけないので、それぞれ、「 99 : 99 : 99 」「一一 . ー」としています。 9 96 # 特定の列の値 ( 今回は UserName ) を基準に CSV を分割する関数 97 functi on sp ⅱ tCsv ($src, $dst, $key) 98 { 99 100 102 103 104 105 106 } # 保存先ディレクトリが存在しない場合は作成 i f ( ! (Test-Path $dst) ) { mkd i r $dst } # CSV を読込み、分割 # 1 行すっ追ファイルに記するという頭の悪い方法なので速度は遅いです C ipcsv $src ー epcsv ( $dst + . csv" ) -Append -Encod i ng UTF8 } [ 図 4-1 刀「ロクオン・ログオフ集計 . psl 」 CSV 分割処理部分 ー図 4 ー 1 刀は CSV を分割する関数です。特定の列の値を基準に分割します。 1 行ずつファイル に追記する方法なので速度は遅いですが、ワンライナーで済むので筆者は多用しています。 24