gci和gci -recurve有不同类型的输出

时间:2017-08-30 07:28:26

标签: powershell

我正在尝试制作文件系统广告资源。

这有效,它给了我每个条目的权力和ACL

Get-ChildItem \\Server\Share\* |  Select-Object @{n='Path';e={ (Get-Item $_.PSPath).FullName }}, PSIsContainer, @{n='Owner';e={ (Get-Acl $_).Owner}}, @{n='Accesstostring';e={ (Get-Acl $_).Accesstostring}}

但是使用-Recurse会给我空的所有者和Accesstostring

Get-ChildItem \\Server\Share\ -Recurse |  Select-Object @{n='Path';e={ (Get-Item $_.PSPath).FullName }}, PSIsContainer, @{n='Owner';e={ (Get-Acl $_).Owner}}, @{n='Accesstostring';e={ (Get-Acl $_).Accesstostring}}

为什么gci会在管道上发送不同的内容? 我怎样才能解决这个问题 ? (我不想制作一个数组,因为它不适合内存)

2 个答案:

答案 0 :(得分:2)

它们是不同的,因为一个数组包含一个文件列表,但是在递归中它是一个目录对象数组,每个目录对象都包含一个文件列表。 下面的代码将执行您想要的操作。请注意,如果路径包含空格,则路径必须在引号中。

Get-ChildItem \\Server\Share\ -Recurse | Select-Object @{n='Path';e={ $_.FullName }}, PSIsContainer, @{n='Owner';e={ (Get-Acl $_.FullName).Owner}}, @{n='Accesstostring';e={ (Get-Acl $_.FullName).Accesstostring}}

答案 1 :(得分:0)

在@ Edjs-perkums answer上进行扩展,这将调用Get-Acl一次,并在管道中的第二个Select-Object中扩展其两个属性。 (为清楚起见,也重新格式化为多行,但它是单个管道。)

Get-ChildItem \\Server\Share\ -Recurse `
    | Select-Object @{n='Path';e={ $_.FullName }}, 
                    @{n='ACL';e={ (Get-Acl $_.Fullname) }},
                    PSIsContainer `
    | Select-Object Path, PSIsContainer, 
                    @{n='Owner';e={ $_.ACL.Owner}}, 
                    @{n='Accesstostring';e={ $_.ACL.Accesstostring}}