如何搜索数百万个文件,并返回特定用户拥有的文件列表?

时间:2016-10-26 16:18:08

标签: file powershell

您好,感谢您的阅读!

我正在努力提出标题中提到的问题的解决方案,我选择的工具目前是Powershell v5。这是我正在使用的源代码,借鉴于此:

https://www.experts-exchange.com/questions/27829378/Find-files-owned-by-specific-users-in-a-shared-directory-sub-directories.html

这是我正在进行中的代码:

$Users = @('DOMAIN\user1','COMAIN\user2')
$NetworkSharePath = "\\filer\directory\subdirectory"

$Files = gci $NetworkSharePath -recurse | ? {$_.PsIsContainer -eq $False}
foreach ($File in $Files)
{
    Write-Host "Processing File: $($File.FullName)"

下面的行用于在每个文件中添加一个“Owner”成员,我评估该文件是否归$ users数组中定义的用户所有。

 $File | Add-Member -MemberType "NoteProperty" -Name "Owner" -Value (($File | Get-Acl).Owner.ToString())
}

这是我正在努力的部分 - 我希望Where-Object部分返回与$ Users数组中的一个用户名匹配的Owners,并将其保存到我可用于文件副本的文件中(备份)我尚未定义的功能。

$Files | Select FullName, Owner | ? {$_.Owner -contains $Users}

2 个答案:

答案 0 :(得分:1)

如果你想通过$ User数组测试元素,你应该反转你的语句:

{$Users -contains $_.Owner}

然后,如果您想将该文件名附加到报告文件,请使用foreach-object运算符

$Files | Select FullName, Owner | ? {$Users -contains $_.Owner} | % { Add-Content $destinationFilePath $_.FullName }

答案 1 :(得分:0)

@freakydinde回答了这个错误;我想建议,对于数百万个文件,通过它们一次并收集名称将花费时间,然后您将在内存中有一个大的列表并再次查看该列表以获得所有者需要时间。然后再次查看该列表以选择答案需要时间。我认为它会更整洁地贯穿整个管道,一步一步地连接步骤,并沿途捕获管道输出。

  • 获取文件及其所有者并保存该信息
  • 然后稍后过滤,如果在过滤时出现问题,则无需再次触摸每个文件。

e.g。

Get-ChildItem "\\filer\directory\subdirectory" -Recurse -File | ForEach-Object {

    Write-Host "Processing File: $_"

    [PSCustomObject]@{
        FullName = $_.FullName
        Owner = (Get-Acl -LiteralPath $_.FullName).Owner.ToString()
    }

} | Tee-Object -Variable files | Export-CSV all-files-and-owners.csv -NoTypeInformation

$Users = @('DOMAIN\user1','COMAIN\user2')
$Files | Where-Object {$_.Owner -in $Users}

然后您可以使用$files = Import-CSV all-files-and-owners.csv更轻松地回复它,并尝试过滤不同的用户,而无需等待再次访问所有文件。

NB。您正在使用$_.PSIsContainer排除目录,这是使PowerShell v2兼容的一种方式。较新的Get-ChildItem支持-Directory-File只能获得一种结果。但是,您还使用了与PowerShell v2兼容的-contains,这就是我将其更改为使用gci -File的原因。

-in-contains对应,但以其他方式测试成员资格。 collection -contains itemitem -in collection

自我生成的PS帮助链接来自我的代码块(如果有):