我在powershell脚本中得到了重复的输出

时间:2014-09-11 18:33:49

标签: powershell filesystems acl

我正在尝试在整个文件系统上显示来自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
        }}

3 个答案:

答案 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 \管理员
访问列表:

  • BUILTIN \ Administrators
  • NT AUTHORITY \ SYSTEM
  • NT AUTHORITY \ Authenticated Users

因此,对于该文件夹,您将遍历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将覆盖任何现有文件,因此无需先删除它。