因此,我尝试为客户端提取 DFS-N 文件夹结构的列表。但是,出于各种原因,我将限制其深度为 $share 的 2 级。此外,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
答案1
如何手动抓取第一级,然后循环第二级作为一个步骤?我将您的代码用于将 ACL 打印到函数中,并手动逐步抓取前三个级别。如果第一级中的项目是文件夹($_.ISPSContainer
),则会提取和处理它们的子项目,然后提取同一级的另一个子项目以获得下一个级别。理想情况下,您不会重复使用代码,应该将其重构为另一个函数来执行递归,但这需要传递一个参数,您可以告诉它要提取多少个级别。然后,每个循环都可以减少该计数器,并在 时调用自身$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 $_
}
}