在文件集合中查找文件

时间:2017-07-21 14:50:43

标签: powershell

我使用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

1 个答案:

答案 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($_)}

虽然我不得不说这对于几百个文件来说过早优化