Compare-Object
2 つのオブジェクトのセットを比較します。
構文
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
説明
このコマンドレットは Compare-Object
、2 セットのオブジェクトを比較します。 1 つのオブジェクト セットが 参照であり、もう 1 つのオブジェクト セットが 違いです。
Compare-Object
オブジェクト全体を比較する使用可能なメソッドのチェック。 適切なメソッドが見つからない場合は、入力オブジェクトの ToString() メソッドを呼び出し、文字列の結果を比較します。 比較に使用する 1 つ以上のプロパティを指定できます。 プロパティが指定されている場合、コマンドレットはそれらのプロパティの値のみを比較します。
比較の結果は、プロパティ値が参照オブジェクト () にのみ表示されたか、差分オブジェクト (<=
) にのみ表示されたかを示します=>
。 IncludeEqual パラメーターを使用する場合、(==
) は値が両方のオブジェクト内にあるかどうかを示します。
参照または差分オブジェクトが null ($null
) Compare-Object
の場合、終了エラーが生成されます。
一部の例では、スプラッティングを使用してコード サンプルの行長を短くします。 詳細については、「about_Splatting」を参照してください。
例
例 1 - 2 つのテキスト ファイルの内容を比較する
次の使用例は、2 つのテキスト ファイルの内容を比較します。 この例では、次の 2 つのテキスト ファイルを使用し、各値を個別の行に配置します。
Testfile1.txt
には、犬、リス、鳥の値が含まれています。Testfile2.txt
には、cat、bird、racoon の値が含まれています。
出力には、ファイル間で異なる行のみが表示されます。 Testfile1.txt
は参照オブジェクト (<=
) で、Testfile2.txt
差分オブジェクト (=>
) です。 両方のファイルに表示されるコンテンツを含む行は表示されません。
Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)
InputObject SideIndicator
----------- -------------
cat =>
racoon =>
dog <=
squirrel <=
例 2 - コンテンツの各行を比較し、相違点を除外する
この例では、ExcludeDifferent パラメーターを使用して、2 つのテキスト ファイル内のコンテンツの各行を比較します。
PowerShell 7.1 の時点で ExcludeDifferent パラメーターを使用すると、IncludeEqual が推論され、出力には、SideIndicator (==
) で示されているように、両方のファイルに含まれる行のみが含まれます。
$objects = @{
ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt)
DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)
}
Compare-Object @objects -ExcludeDifferent
InputObject SideIndicator
----------- -------------
bird ==
例 3 - PassThru パラメーターを使用する場合の違いを表示する
通常は、 Compare-Object
次のプロパティを 持つ PSCustomObject 型を返します。
- 比較対象の InputObject
- 出力がどの 入力オブジェクトに属するかを示す SideIndicator プロパティ
PassThru パラメーターを使用すると、オブジェクトの型は変更されませんが、返されるオブジェクトのインスタンスには、SideIndicator という名前の NoteProperty が追加されます。 SideIndicator は、出力が属する入力オブジェクトを示します。
次の例は、さまざまな出力の種類を示しています。
$a = $True
Compare-Object -IncludeEqual $a $a
(Compare-Object -IncludeEqual $a $a) | Get-Member
InputObject SideIndicator
----------- -------------
True ==
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
InputObject NoteProperty System.Boolean InputObject=True
SideIndicator NoteProperty string SideIndicator===
Compare-Object -IncludeEqual $a $a -PassThru
(Compare-Object -IncludeEqual $a $a -PassThru) | Get-Member
True
TypeName: System.Boolean
Name MemberType Definition
---- ---------- ----------
CompareTo Method int CompareTo(System.Object obj), int CompareTo(bool value), int IComparable.CompareTo(Syst
Equals Method bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable[bool].Equals(bool ot
GetHashCode Method int GetHashCode()
GetType Method type GetType()
GetTypeCode Method System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
ToBoolean Method bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte Method byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar Method char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime Method datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal Method decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble Method double IConvertible.ToDouble(System.IFormatProvider provider)
ToInt16 Method short IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32 Method int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64 Method long IConvertible.ToInt64(System.IFormatProvider provider)
ToSByte Method sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToSingle Method float IConvertible.ToSingle(System.IFormatProvider provider)
ToString Method string ToString(), string ToString(System.IFormatProvider provider), string IConvertible.To
ToType Method System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider)
ToUInt16 Method ushort IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32 Method uint IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64 Method ulong IConvertible.ToUInt64(System.IFormatProvider provider)
TryFormat Method bool TryFormat(System.Span[char] destination, [ref] int charsWritten)
SideIndicator NoteProperty string SideIndicator===
PassThru を使用すると、元のオブジェクト型 (System.Boolean) が返されます。 System.Boolean オブジェクトの既定の形式で表示される出力に、SideIndicator プロパティが表示されなかったことに注意してください。 ただし、返される System.Boolean オブジェクトには追加 された NoteProperty があります。
例 4 - プロパティを使用して 2 つの単純なオブジェクトを比較する
この例では、長さが同じ 2 つの異なる文字列を比較します。
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual
Length SideIndicator
------ -------------
3 ==
例 5 - プロパティを使用した複雑なオブジェクトの比較
この例では、複雑なオブジェクトを比較するときの動作を示します。 この例では、PowerShell のインスタンスごとに 2 つの異なるプロセス オブジェクトを格納します。 どちらの変数にも、同じ名前のプロセス オブジェクトが含まれています。 Property パラメーターを指定せずにオブジェクトを比較すると、コマンドレットはオブジェクトが等しいと見なします。 InputObject の値は ToString() メソッドの結果と同じであることに注意してください。 System.Diagnostics.Process クラスには IComparable インターフェイスがないため、コマンドレットはオブジェクトを文字列に変換し、結果を比較します。
PS> Get-Process pwsh
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
101 123.32 139.10 35.81 11168 1 pwsh
89 107.55 66.97 11.44 17600 1 pwsh
PS> $a = Get-Process -Id 11168
PS> $b = Get-Process -Id 17600
PS> $a.ToString()
System.Diagnostics.Process (pwsh)
PS> $b.ToString()
System.Diagnostics.Process (pwsh)
PS> Compare-Object $a $b -IncludeEqual
InputObject SideIndicator
----------- -------------
System.Diagnostics.Process (pwsh) ==
PS> Compare-Object $a $b -Property ProcessName, Id, CPU
ProcessName Id CPU SideIndicator
----------- -- --- -------------
pwsh 17600 11.4375 =>
pwsh 11168 36.203125 <=
比較するプロパティを指定すると、コマンドレットに相違点が表示されます。
例 6 - IComparable を実装する複雑なオブジェクトの比較
オブジェクトが IComparable を実装している場合、コマンドレットはオブジェクトを比較する方法を検索します。オブジェクトが異なる型の場合、Difference オブジェクトは ReferenceObject の型に変換され、比較されます。
この例では、文字列と TimeSpan オブジェクトを比較しています。 最初のケースでは、オブジェクトが等しくなるように文字列が TimeSpan に変換されます。
Compare-Object ([TimeSpan]"0:0:1") "0:0:1" -IncludeEqual
InputObject SideIndicator
----------- -------------
00:00:01 ==
Compare-Object "0:0:1" ([TimeSpan]"0:0:1")
InputObject SideIndicator
----------- -------------
00:00:01 =>
0:0:1 <=
2 番目のケースでは、 TimeSpan は文字列に変換されるため、オブジェクトは異なります。
パラメーター
-CaseSensitive
比較においては、大文字と小文字が区別されることを示します。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Culture
比較に使用するカルチャを指定します。
Type: | String |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-DifferenceObject
参照オブジェクトと比較されるオブジェクトを指定します。
Type: | PSObject[] |
Position: | 1 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-ExcludeDifferent
このコマンドレットは、等しい比較対象のオブジェクトの特性のみを表示することを示します。 オブジェクト間の違いはカードされません。
ExcludeDifferent と IncludeEqual を使用して、参照オブジェクトと差分オブジェクトの間で一致する行のみを表示します。
IncludeEqual を指定せずに ExcludeDifferent を指定した場合、出力はありません。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-IncludeEqual
IncludeEqual は、参照オブジェクトと差分オブジェクトの一致を表示します。
既定では、出力には参照オブジェクトと差分オブジェクトの違いも含まれます。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-PassThru
PassThru パラメーターを使用する場合は、Compare-Object
比較されたオブジェクトを囲む PSCustomObject ラッパーを省略し、異なるオブジェクトを変更せずに返します。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Property
比較する参照オブジェクトと差分オブジェクトのプロパティの配列を指定します。
Property パラメーターの値には、新しい計算プロパティを指定できます。 計算プロパティには、スクリプト ブロックまたはハッシュ テーブルを指定できます。 有効なキーと値のペアは次のとおりです。
- 式 -
<string>
または<script block>
詳細については、「about_Calculated_Properties」を参照してください。
Type: | Object[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ReferenceObject
比較の参照として使用されるオブジェクトの配列を指定します。
Type: | PSObject[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-SyncWindow
オブジェクトのコレクション内の一致を検索するときに検査する Compare-Object
隣接オブジェクトの数を指定します。 Compare-Object
は、コレクション内の同じ位置にあるオブジェクトが見つからない場合に、隣接するオブジェクトを調べます。 既定値は [Int32]::MaxValue
、オブジェクト コレクション全体を調べることを意味 Compare-Object
します。
大規模なコレクションを使用する場合、既定値は効率的ではない可能性がありますが、正確です。 SyncWindow に小さい値を指定すると、パフォーマンスが向上しますが、精度が低くなる可能性があります。
Type: | Int32 |
Position: | Named |
Default value: | [Int32]::MaxValue |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
入力
パイプラインの下にオブジェクトを送信するには、DifferenceObject パラメーターを指定します。
出力
None
既定では、ReferenceObject と DifferenceObject が同じ場合、このコマンドレットは出力を返しません。
オブジェクトが異なる場合、このコマンドレットは PSCustomObject ラッパー内の異なるオブジェクトを SideIndicator プロパティと共にラップして、相違点を参照します。
IncludeEqual パラメーターを使用し、オブジェクトが同じである場合、コマンドレットは、SideIndicator プロパティが設定された PSCustomObjectでラップされたオブジェクトを==
返します。
PassThru パラメーターを使用すると、オブジェクトの型は変更されませんが、返されるオブジェクトのインスタンスには、SideIndicator という名前の NoteProperty が追加されます。 SideIndicator は、出力が属する入力オブジェクトを示します。
メモ
PowerShell には、次のエイリアスが Compare-Object
含まれています。
- Windows:
compare
diff
PassThru パラメーターを使用する場合、コンソールに表示される出力に SideIndicator プロパティが含まれていない可能性があります。 オブジェクト型出力Compare-Object
の既定の書式ビューには、SideIndicator プロパティは含まれません。 詳細については、この記事の例 3 を参照してください。
関連リンク
PowerShell
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示