我使用PowerShell比较两个文件名目录。我可以让它在$dir1
中迭代并查找$dir2
中的每个文件,但这是可以理解的"慢"通过网络传输500个文件。
我想使用$files = gci $dir1
捕获集合中的所有文件,遍历$dir2
并搜索集合中的每个文件。
我试过了:
$files = gci $dir1
gci $dir2 | foreach {
if ($files -contains $_) {
echo "found" }
}
当然,这太容易了。
以合理快速的方式进行搜索的最佳方法是什么?
在阅读@Mathias回答后,我从使用Select Name
切换到gci $dir1 -Name
,现在包含有效。当然这改变了问题,因为我不再处理文件对象的集合,只是字符串。
由于我在$ dir2中寻找丢失的文件,最终的代码如下所示:
$files = gci $dir2 -name
$count = 0
gci $dir1 -name | foreach {
$fname = $_
if ($files -notcontains $fname) {
echo "not found: $fname"
$count +=1 }
}
$count
答案 0 :(得分:1)
如果只比较文件名,请使用-Name
参数以避免额外的不必要输出:
$names = Get-ChildItem $dir1 -Name
您可以使用哈希表来存储第一组文件的文件名。对哈希表的密钥查找比通过集合迭代(两次)更快:
$names = Get-ChildItem $dir1 -Name |% {$ht = @{}} {$ht[$_]=1} {return $ht}
现在您可以浏览第二组文件,这次使用哈希表上的ContainsKey()
方法而不是-contains
运算符:
$Duplicates = Get-ChildItem $dir2 -Name |Where-Object {$ht.ContainsKey($_)}
虽然我不得不说这对于几百个文件来说过早优化