次の方法で共有


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 には、dog、squirrel、bird の値が含まれています。
  • 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 パラメーターを使用すると、オブジェクトの Type は変更されませんが、返されるオブジェクトのインスタンスに 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

このコマンドレットは、比較されたオブジェクトの等しい特性のみを表示することを示します。 オブジェクト間の違いは破棄されます。

参照オブジェクトと差分オブジェクトの間で一致する行のみを表示するには、IncludeEqualExcludeDifferent を使用します。

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

-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

入力

PSObject

パイプラインの下にオブジェクトを送信して、 DifferenceObject パラメーターを指定できます。

出力

None

既定では、 ReferenceObjectDifferenceObject が同じ場合、このコマンドレットは出力を返しません。

PSCustomObject

オブジェクトが異なる場合、このコマンドレットは、相違点を参照するために SideIndicator プロパティを使用して PSCustomObject ラッパー内の異なるオブジェクトをラップします。

IncludeEqual パラメーターを使用し、オブジェクトが同じである場合、コマンドレットは SideIndicator プロパティが に設定された PSCustomObject でラップされたオブジェクトを==返します。

PassThru パラメーターを使用すると、オブジェクトの Type は変更されませんが、返されるオブジェクトのインスタンスに SideIndicator という名前の NoteProperty が追加されます。 SideIndicator は、出力が属する入力オブジェクトを示します。

メモ

PowerShell には、 の次のエイリアスが Compare-Object含まれています。

  • Windows の場合:
    • compare
    • diff

PassThru パラメーターを使用する場合、コンソールに表示される出力に SideIndicator プロパティが含まれていない場合があります。 によって Compare-Object 出力されるオブジェクト型の既定の書式ビューには、 SideIndicator プロパティは含まれません。 詳細については、この記事の 例 3 を参照してください。