如何在PowerShell中使用Compare-Object?

PowerShell中的Compare-Object命令用于比较两个对象。对象可以是可变内容,两个文件,字符串等。此cmdlet使用很少的语法来显示对象之间的差异,这称为旁指示符。

=> - Difference in destination object.
<= - Difference in reference (source) object.
== - When the source and destination objects are equal.

例1:比较两个字符串。

PS C:\> Compare-Object "World" "Alpha"

InputObject SideIndicator
----------- -------------
Alpha =>
World <=

在上面的示例中,Alpha字符串显示右指示器表示它与源对象的区别,而World字符串显示左指示器表示它与目标对象的区别。

例2:比较两个相等的字符串。

以下示例将不会显示任何输出,因为源和目标参考对象是相同的,但是当您使用-IncludeEqual参数时,它将显示匹配对象的等号(==)

PS C:\> Compare-Object "World" "woRld"

PS C:\> Compare-Object "World" "woRld" -IncludeEqual

InputObject SideIndicator
----------- -------------
World ==

请注意,比较对象不区分大小写。对于区分大小写的比较,请使用-CaseSensitive参数。

PS C:\> Compare-Object "World" "woRld" -CaseSensitive


InputObject SideIndicator
----------- -------------
woRld =>
World <=

例3:源文件和目标文件的比较。

$sourcefiles = Get-ChildItem C:\Test1 -Recurse
$destfiles = Get-ChildItem C:\Test2\ -Recurse
Compare-Object $sourcefiles $destfiles -IncludeEqual

输出结果

InputObject SideIndicator
----------- -------------
File1.txt ==
File3.txt =>
File2.txt <=

上面的示例显示file1.txt在两个位置都存在,而File3.txt在目标位置而不是源位置,而File2.txt在源位置而不是目标位置。

如果我们用- ExcludeDifference -参数,输出不会,除非我们添加显示IncludeEqual参数。

Compare-Object $sourcefiles $destfiles -ExcludeDifferent

以下命令将仅显示匹配的文件。

PS C:\> Compare-Object $sourcefiles $destfiles -IncludeEqual -ExcludeDifferent

InputObject SideIndicator
----------- -------------
File1.txt ==

示例4:与属性名称的比较。

要比较具有特定属性名称的两个对象,请使用-Property参数。在下面的示例中,我们将比较文件LastWriteTime。

示例

$sfiles = Get-ChildItem C:\Test1\ -Recurse
$dfiles = Get-ChildItem C:\Test2\ -Recurse

Compare-Object $sfiles $dfiles -Property LastWriteTime -IncludeEqual

输出结果

LastWriteTime SideIndicator
------------- -------------
8/28/2020 7:27:11 AM ==
8/28/2020 7:29:00 AM =>
8/28/2020 7:49:37 AM <=

如果在输出中需要任何特定属性的名称,请先添加该属性,然后添加要比较的属性名称。例如,

示例

Compare-Object $sfiles $dfiles -Property Name, LastWriteTime -IncludeEqual

输出结果

Name LastWriteTime SideIndicator
---- ------------- -------------
File1.txt 8/28/2020 7:27:11 AM ==
File3.txt 8/28/2020 7:29:00 AM =>
File2.txt 8/28/2020 7:49:37 AM <=