compare-objectの使い方
参考
留意事項
サンプルファイル内容
> Get-Content .\a.csv h1,h2,h3 a,b,c e,f,G > Get-Content .\b.csv e,f,g a,b,d h1,h2,h3
①ファイル指定では中身の違いは分からず。
> Compare-Object .\a.csv .\b.csv InputObject SideIndicator ----------- ------------- .\b.csv => .\a.csv <=
②ファイルの中身の違いを知るには、get-contentする必要あり。
> Compare-Object (Get-Content .\a.csv) (Get-Content .\b.csv) InputObject SideIndicator ----------- ------------- a,b,d => a,b,c <=
③文字列の出現順は考慮されていない。
②の結果を参照。「h1,h2,h3」はa.txtとb.txtで出現行が違うが差異として認識しない。
④大文字小文字は区別しない
②の結果を参照。「e,f,G」と「e,f,g」が同一扱いされている。
⑤差異のみ出力
②の結果を参照。
⑥マルチバイト文字はデコードした上で比較する。
でないと結果が文字化けする。
> Compare-Object (Get-Content .\a.csv -Encoding UTF8) (Get-Content .\b.csv -Encoding UTF8)
⑦プロパティを比較するときは明示的に指定する。(指定しないと差異は比較していない)
後述のPropertyオプションを参照
オプション調査
CaseSensitive
大文字小文字区別する
> Compare-Object (Get-Content .\a.csv) (Get-Content .\b.csv) -CaseSensitive InputObject SideIndicator ----------- ------------- e,f,g => a,b,d => a,b,c <= e,f,G <=
ExcludeDifferent、IncludeEqual
ExcludeDifferent→差異を出力しない。
IncludeEqual→等しい情報も出力する。
両方一緒に使う。
> Compare-Object (Get-Content .\a.csv) (Get-Content .\b.csv) -ExcludeDifferent -IncludeEqual InputObject SideIndicator ----------- ------------- h1,h2,h3 == e,f,G ==
SyncWindow
helpのGoogle翻訳結果は以下
オブジェクトのコレクション内で一致を検索するときに「Compare-Object」が検査する隣接オブジェクトの数を指定します。
「Compare-Object」は、コレクション内の同じ位置にオブジェクトが見つからない場合に、隣接するオブジェクトを検査します。
デフォルト値は `[Int32]::MaxValue` で、これは `Compare-Object` がオブジェクト コレクション全体を検査することを意味します。
出現順まで見る時は、0を指定する。こっちの方が正確な気がする。。。
> Compare-Object (Get-Content .\a.csv) (Get-Content .\b.csv) -SyncWindow 0 InputObject SideIndicator ----------- ------------- e,f,g => h1,h2,h3 <= a,b,d => a,b,c <= h1,h2,h3 => e,f,G <=
passthru
helpのGoogle翻訳結果は以下
PassThru パラメーターを使用すると、「Compare-Object」は比較されるオブジェクトを囲む PSCustomObject ラッパーを省略し、異なるオブジェクトを変更せずに返します。
結果オブジェクトがシンプルになる。
> Compare-Object (Get-Content .\a.csv) (Get-Content .\b.csv) | Get-Member | Out-String -Stream | Select-String "TypeName" TypeName: System.Management.Automation.PSCustomObject > Compare-Object (Get-Content .\a.csv) (Get-Content .\b.csv) -PassThru | Get-Member | Out-String -Stream | Select-String "TypeName" TypeName: System.String
Property
helpのGoogle翻訳結果は以下
比較する参照オブジェクトと差分オブジェクトのプロパティの配列を指定します。
Property パラメーターの値は、新しく計算されたプロパティにすることができます。計算されたプロパティは、スクリプト ブロックまたはハッシュ テーブルにすることができます。有効なキーと値のペアは次のとおりです。
- 式 - `<文字列>` または `<スクリプト ブロック>`
詳細については、「about_Practical_Properties (../Microsoft.PowerShell.Core/About/about_owned_Properties.md)」を参照してください。
オプション指定しないと比較対象オブジェクトのプロパティの値は比較しない。オプションでプロパティを指定すると比較する。プロパティは複数指定が可能。
get-processコマンドで、wslプロセス情報を異なる時間で2回取得する。それを比較すると
$w1 = Get-Process | Where-Object {$_.processname -match "wsl"} $w2 = Get-Process | Where-Object {$_.processname -match "wsl"} > $w1 Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 0 0 675216 637140 9388 0 vmmemWSL 186 11 2552 10960 0.27 31708 1 wsl 123 8 1468 7564 0.02 11200 1 wslhost 139 9 1560 8484 0.00 11492 1 wslhost 141 9 1736 8872 0.00 13404 1 wslhost > $w2 Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 0 0 675216 637196 9388 0 vmmemWSL 182 11 2556 11044 0.27 31708 1 wsl 123 8 1468 7564 0.02 11200 1 wslhost 143 9 1628 8616 0.00 11492 1 wslhost 141 9 1736 8872 0.00 13404 1 wslhost > Compare-Object $w1 $w2 > > Compare-Object $w1 $w2 -Property WorkingSet64 WorkingSet64 SideIndicator ------------ ------------- 652488704 => 11309056 => 8822784 => 652431360 <= 11223040 <= 8687616 <=