您好,感谢您的阅读!
我正在努力提出标题中提到的问题的解决方案,我选择的工具目前是Powershell v5。这是我正在使用的源代码,借鉴于此:
这是我正在进行中的代码:
$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}
答案 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 item
或item -in collection
自我生成的PS帮助链接来自我的代码块(如果有):
Get-ChildItem
(在模块Microsoft.PowerShell.Management
中)ForEach-Object
Write-Host
(在模块Microsoft.PowerShell.Utility
中)Get-Acl
(在模块Microsoft.PowerShell.Security
中)Tee-Object
(在模块Microsoft.PowerShell.Utility
中)Export-Csv
(在模块Microsoft.PowerShell.Utility
中)Where-Object