Get-ChildItem 2-3级

所以,我试图拉一个客户端的DFS-N文件夹结构的列表。 不过,由于各种原因,我将把它限制在$ share的两个水平。 此外,40多个文件服务器还没有PowerShell 5,所以使用-depth开关现在不是一个选项。

我遇到的问题是,我读的方法应该限制它,没有正确地限制它。

Get-ChildItem -path $share,$share\*,$share\*\* | ForEach-Object { $Path = "$_" $Acl = Get-Acl $Path $Acl | Select-Object -ExpandProperty Access | Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru | Add-Member -MemberType NoteProperty -Name Owner -Value $Acl.Owner -PassThru 

然而,当我看到输出时,它包含了$ path下面的每个文件夹,其中一些文件夹是深度3层,不仅仅是2个。这不是一个大问题,但是我想知道是否有人知道我做错了吗? 例如,$ share被定义为:

 $share = "\\" + $server + "\" + $site + "_Data" 

但是我看到的结果就像是:\\ namespace \ site_data \ SOX \ Activo Fijo 2016 \ Septiembre

如何只手动抓住第一级,然后循环虽然第二级作为一个步骤? 我把你的代码打印到一个函数中,并通过抓取前三个级别手动join。 如果第一级中的项目是文件夹( $_.ISPSContainer ),他们将获取他们的子项目并进行处理,而另一个级别相同以获得下一个级别。 理想情况下,你不会重新使用代码,它应该被重构到另一个函数来执行recursion,但是这需要传递一个参数,你可以告诉它多less级别拉。 然后每个循环可以递减该计数器,如果$counter -gt 0自己调用自己。

 Function Print-Acl { param( [Parameter( Position=0, Mandatory=$true) ] [String[]]$Path ) $Acl = Get-Acl $Path $Acl | Select-Object -ExpandProperty Access | Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru | Add-Member -MemberType NoteProperty -Name Owner -Value $Acl.Owner -PassThru } Get-ChildItem -path $share | ForEach-Object { # First Level if ($_.PSIsContainer) { Print-Acl -Path $_.FullName Get-ChildItem -Path $_.FullName | ForEach-Object { # Second Level if ($_.PSIsContainer) { # Third level Print-Acl -Path $_.FullName Get-ChildItem -Path $_.FullName | ForEach-Object { Print-Acl -Path $_.FullName } } else { Print-Acl -Path $_.FullName } } } else { Print-Acl -Path $_ } }