我有这个脚本来比较两个文件夹。
$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."
}
如您所见,我比较了同一个文件夹。问题是,它永远不会考虑,数组是相等的。为什么呢?
答案 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