【问题标题】:Outputting PowerShell data to a string将 PowerShell 数据输出到字符串
【发布时间】:2014-08-28 19:45:51
【问题描述】:

这真的是 PowerShell 101,我意识到,但我被卡住了。

我正在尝试遍历文件夹树,获取每个子文件夹名称和文件数。没有问题。

新的要求是获取每个子文件夹的 ACL。所有这些数据都需要作为 CSV 文件输出,其中一行包含每个文件夹名称、文件计数和 CSV 一个字段中单个字符串中的 ACL(我打算用分号分隔它们)。

如果可以在 Excel 中查看数据,我愿意导出为 XML。

我遇到困难的部分是将 ACL 信息放入 CSV 的单个字符串中。

每个目录上的Get-ACL 显示数据如下(我正在做Select 只是为了获取IdentityReference 和FileSystemRights,这是我们感兴趣的全部内容):

IdentityReference             FileSystemRights
-----------------             ----------------
BUILTIN\Users      ReadAndExecute, Synchronize
BUILTIN\Users                       AppendData
BUILTIN\Users                      CreateFiles

我希望输出文件格式为每个子目录一行,类似于

#filecount,folder,perms
51,C:\temp,BUILTIN\Users:ReadAndExecute,Synchronize;BUILTIN\Users:AppendData...

但是,我无法让任何类型的join 以这种方式呈现它。我不关心使用什么分隔符组合(同样,必须在 Excel 中可读)。

脚本如下。输出文件的数据行附加在它遍历的每个目录中。我确信这不是很有效,但我也不希望进程消耗所有服务器内存。我无法弄清楚的位以###开头。

(Get-ChildItem C:\temp -recurse | Where-Object {$_.PSIsContainer -eq $True}) | foreach {
    $a = ($_.GetFiles().Count)
    $f = $_.FullName
    $p = (get-acl $_.FullName).Access | select-object identityreference,filesystemrights
    ### do something with $p?
    Out-File -FilePath c:\outfile.csv -Append -InputObject $a`,$f`,###$p?
}

【问题讨论】:

    标签: string powershell csv


    【解决方案1】:

    由于您希望将文件夹的所有 ACE 合并为一行,因此您需要这样的内容:

    Get-ChildItem 'C:\temp' -Recurse | ? { $_.PSIsContainer } | % {
      # build a list of "trustee:permissions" pairs
      $perms = (Get-Acl $_.FullName).Access | % {
                 "{0}:{1}" -f $_.IdentityReference, $_.FileSystemRights
               }
    
      New-Object -Type PSObject -Property @{
        'Filecount'   = $_.GetFiles().Count
        'Folder'      = $_.FullName
        'Permissions' = $perms -join ';'  # join the list to a single string
      }
    } | Export-Csv 'c:\outfile.csv' -NoType
    

    在循环内重复追加通常会导致性能不佳,因此应尽可能避免。外部循环创建一个自定义对象列表,然后可以通过Export-Csv 一次性导出。

    【讨论】:

    • 完美运行。我没有想到要创建一个新的 PSObject,因为我使用的是 Powershell 2.0。我仍然担心将全部内容读入内存并在最后通过 Export-CSV 输出,但我会注意内存消耗。
    • @Trix:管道应该将对象提供给Export-Csv,因为它们是在循环中生成的,所以我不会期望过多的内存负载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2013-11-07
    • 2021-07-07
    相关资源
    最近更新 更多