比较PowerShell中的数组变量

时间:2012-03-07 08:39:44

标签: powershell powershell-v2.0

我有这个脚本来比较两个文件夹。

$firstfolder = Get-ChildItem C:\firstfolder
$secondfolder = Get-ChildItem C:\firstfolder

if ($firstfolder -eq $secondfolder) {
Write-Host "Folders are the same."
} else {
    Write-Host "Error: Doesn't match."
}

如您所见,我比较了同一个文件夹。问题是,它永远不会考虑,数组是相等的。为什么呢?

3 个答案:

答案 0 :(得分:31)

在PowerShell中,通过枚举数组本身的内容,在表达式中计算指向数组的变量。

例如这个表达式:

$firstFolder | Get-Member

将返回有关System.IO.DirectoryInfo类型的信息,这类型确实是$firstFolder数组中 first 元素的类型。如果要对数组对象本身进行操作,则必须明确告诉PowerShell使用,运算符将对象视为数组。以下表达式:

,$firstFolder | Get-Member

预计会返回有关System.Object[]的信息。

但是,当在两个数组变量之间使用-eq运算符时,事情会有所不同。事实上,PowerShell将枚举左侧上的数组,并将每个项目与右侧整个的数组进行比较。如果没有匹配项,结果将是一系列匹配项什么都不。例如:

$a = 1..5
$b = 1..5
$a -eq $b         # returns zero-length array
[bool]($a -eq $b) # returns $false
$a -eq 3          # returns 3

在您的特定情况下,结果将是零长度数组(或$false,如果转换为boolean),因为$firstFolder数组包含System.IO.DirectoryInfo个对象与$secondFolder变量中的数组完全匹配。

您真正想要的是将两个阵列的内容相互比较。这就是Compare-Object cmdlet派上用场的地方:

Compare-Object $firstFolder $secondFolder -SyncWindow 0

这将在两个数组之间返回差异数组,或者在数组相等时返回$null。更准确地说,结果数组将包含每个项目的对象,该对象仅存在于一个数组中而不存在于另一个数组中。 -SyncWindow 0参数将使项目在数组中出现的顺序计为差异。

如果只需要一个简单的方法来判断这两个数组是否不同而没有进入 不同的细节,你可以简单地检查{{3]返回的数组的长度。 }}:

$areEqual = @(Compare-Object $firstFolder $secondFolder -SyncWindow 0).Length -eq 0

请注意我是如何明确告诉PowerShell始终将结果打包到数组中的,因为当数组不包含任何差异时,Compare-Object可能会返回$null

答案 1 :(得分:5)

对于这种比较,您必须使用cmdlet compare-object并评估是否存在差异!

答案 2 :(得分:0)

也许是这样。

function arrayequal($a, $b) {
  -not (compare $a $b)
}

arrayequal $a $b

True