我正在尝试在整个文件系统上显示来自foders,子文件夹和文件的信息。它似乎工作得很好,除了我不断得到每个文件的倍数结果。当我运行此脚本时,生成的csv为每个文件显示三行,包含相同的数据。 (使我的文件比我希望的大得多)
$OutFile = "C:\Owners.csv"
$Header = "Folder Path,FileName,LastAccessTime,Owner"
Del $OutFile
Add-Content -Value $Header -Path $OutFile
$RootPath = "S:\0411"
$Folders = dir $RootPath -recurse
foreach ($Folder in $Folders){
$ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access }
Foreach ($ACL in $ACLs){
$OutInfo = $Folder.Fullname + "," + $Folder.name + "," + $Folder.LastAccessTime + "," + ((Get-ACL $Folder.FullName).Owner)
$arr += $obj
Add-Content -Value $OutInfo -Path $OutFile
}}
答案 0 :(得分:1)
您看到多个结果,因为每个文件/文件夹都有多个与之关联的ACL。
您正在接收每个文件/文件夹,然后循环浏览并获取每个文件/文件夹的ACL。
将$ OutInfo的行修改为以下内容以查看我的意思:
$OutInfo = $Folder.Fullname + "," + $Folder.name + "," + $Folder.LastAccessTime + "," + ((Get-ACL $Folder.FullName).Owner) + "," + $ACL.IdentityReference + "," + $ACL.FileSystemRights
编辑:错字
答案 1 :(得分:0)
如果没有别的,请进一步跳到更好的解决方案。第一点解释了您的问题的答案,但有更好的方法来做事。
您正在获取欺骗,因为您获取ACL的每个文件/文件夹,然后对于您在循环访问列表中的每个ACL。所以,让我们说......
文件夹:C:\ Temp
所有者:BUILTIN \管理员
访问列表:
因此,对于该文件夹,您将遍历Access列表,该列表包含3个条目。对于每个条目,您都要在CSV文件中输出一行。
更好的解决方案:
好的,你正在手动构建一个CSV文件,这太疯狂了。让我们更容易做到:
$OutFile = "C:\Owners.csv"
$RootPath = "S:\0411"
$Folders = dir $RootPath -recurse
$Folders | Select FullName,Name,LastAccessTime,@{l='Owner';e={Get-ACL $_.FullName | Select -ExpandProperty Owner}} | Export-CSV $OutFile -NoTypeInformation -Force
答案 2 :(得分:0)
$OutFile = "C:\Owners.csv"
$RootPath = "S:\0411"
Get-ChildItem $RootPath -Recurse | Select-Object FullName,Name,LastAccessTime,
@{n='Owner';e={(get-acl $_.FullName).owner}} | Export-CSV $OutFile
请注意,Get-ChildItem将获取所有文件夹和文件,而不仅仅是文件夹。因为你命名变量$ folders,我怀疑你只想要容器?如果是这样,请使用-ad开关:
$OutFile = "C:\Owners.csv"
$RootPath = "S:\0411"
Get-ChildItem $RootPath -ad -Recurse | Select-Object FullName,Name,LastAccessTime,
@{n='Owner';e={(get-acl $_.FullName).owner}} | Export-CSV $OutFile
一些建议: 1)不要在脚本中使用别名。它们适合在控制台中使用,而不是其他任何人需要阅读它。例如,Get-ChildItem的'dir',Remove-Item的'del'。 2)如果您正在寻找CSV输出,请学习使用Select-Object和Export-CSV。 3)Export-CSV将覆盖任何现有文件,因此无需先删除它。