質問そのものへの回答
$Datas[0] -eq $Data
の場合、PSObjectのインスタンスが同じかどうか、の判定となっているはずです(中の値は一切考慮していない)。
日時・ユーザー名の完全一致を確認したい場合、
($Datas[0].日時 -eq $Data.日時) -and ($Datas[0].ユーザ名 -eq $Data.ユーザ名)
とする必要があります(PowerShellの-eq
演算子は大文字小文字を区別しないため、必要であれば-ieq
などを使用します)。
参考:重複の排除
参考として、PowerShellの組み込みコマンドレットや.NETのクラスを使って重複を排除する方法を示します。
厳密な判定にはなりませんが、他の質問を見る限り、以下の方法でも大体はなんとかなると思います。
簡易判定・順番無視
posh
1Write-Host 簡易判定・順番無視
2# ユーザー名と日時を文字列連結した結果({$_.ユーザ名 + $_.日時})を使って重複排除
3$Datas |
4 Sort-Object -Property {$_.ユーザ名 + $_.日時} -Unique
Sort-Object
コマンドレットにUnique
スイッチを指定すると、重複を排除できます。
また、Property
にスクリプトブロックを渡すことでソートのキーを指定できます。
一致の判定方法:単純に文字列結合して比較
順番:維持されない
簡易判定・順番維持
posh
1$orderDic = New-Object -TypeName System.Collections.Specialized.OrderedDictionary
2foreach ( $o in $Datas ) {
3 $key = $o.ユーザ名 + $o.日時
4 if ( !$orderDic.Contains($key) ) {
5 $orderDic.Add( $key , $o )
6 }
7}
8Write-Host 簡易判定・順番維持
9$orderDic.Values
一致判定に使う物は先ほどと同じで、OrderedDictionary
を使うことで順番を維持しながら重複を排除します。
一致の判定方法:単純に文字列結合して比較
順番:維持される
上記処理比較用サンプル
posh
1# https://teratail.com/questions/125630
2# 参考・サンプル用
3
4# 配列の+=演算子は遅いのでListで代替
5$Datas = New-Object -TypeName System.Collections.Generic.List[psobject]
6
7# パターンを増やすため生成方法変更
8[string]$csvString = @'
9日時,ユーザ名
102018/05/11,hoge
112018/05/11,hogehoge
122018/05/11,hoge
132018/05/12,hoge
14'@
15
16$csvString | ConvertFrom-Csv | %{ $Datas.Add($_) }
17
18
19Write-Host 簡易判定・順番無視
20# ユーザー名と日時を文字列連結した結果({$_.ユーザ名 + $_.日時})を使って重複排除
21$Datas |
22 Sort-Object -Property {$_.ユーザ名 + $_.日時} -Unique | Format-Table #無いと出力がごちゃ混ぜになってしまうため
23<#
24日時 ユーザ名
25-- ----
262018/05/11 hoge
272018/05/12 hoge
282018/05/11 hogehoge
29#>
30
31
32$orderDic = New-Object -TypeName System.Collections.Specialized.OrderedDictionary
33foreach ( $o in $Datas ) {
34 $key = $o.ユーザ名 + $o.日時
35 if ( !$orderDic.Contains($key) ) {
36 $orderDic.Add( $key , $o )
37 }
38}
39Write-Host 簡易判定・順番維持
40$orderDic.Values
41<#
42日時 ユーザ名
43-- ----
442018/05/11 hoge
452018/05/11 hogehoge
462018/05/12 hoge
47#>