pikesaku’s blog

個人的な勉強メモです。記載内容について一切の責任は持ちません。

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 <=