2012-09-13 41 views
2

下面的PowerShell脚本将列出所有共享文件夹(不包括隐藏的共享文件夹),然后列出所有子文件夹并最终获取每个文件夹的ACL信息并导出到CSV文件。只使用PowerShell递归子文件夹的x个级别

但是,我试图设置它可以钻入的子文件夹的限制。例如,如果将其设置为3,则该脚本将获得前三个子文件夹的ACL信息。我怎样才能做到这一点?

输入:

path=\\server\sharefolder0\subfolder01\subfolder02 
path=\\server\sharefolder1\subfolder11\subfolder12\subfolder13\subfolder14 
path=\\server\sharefolder2 

预期结果:

path=\\server\sharefolder0 
path=\\server\sharefolder0\subfolder01 
path=\\server\sharefolder0\subfolder01\subfolder02 
path=\\server\sharefolder1 
path=\\server\sharefolder1\subfolder11 
path=\\server\sharefolder1\subfolder11\subfolder12 
path=\\server\sharefolder2 

这是代码:

$getSRVlist = Get-Content .\server.txt 
$outputDirPath=".\DirPathList.txt" 
$outputACLInfo=".\ACLInfo.CSV" 
$header="FolderPath,IdentityReference,Rights" 
Del $outputACLInfo 
add-content -value $header -path $outputACLInfo 
foreach ($readSRVlist in $getSRVlist) 
{ 
    foreach ($readShareInfoList in $getShareInfoList=Get-WmiObject Win32_Share 
    -computerName $readSRVlist | Where {$_.name -notlike "*$"} | %{$_.Name}) 
    { 
     foreach ($readDirPathList in 
     $getDirPathList=get-childitem \\$readSRVlist\$readShareInfoList -recurse 
     | where {$_.PSIsContainer})# | %{$_.fullname}) 
     { 
     $getACLList=get-ACL $readDirPathList.fullname | ForEach-Object 
     {$_.Access} 
     foreach ($readACLList in $getACLList) 
     { 
      $a = $readDirPathList.fullname + "," + 
      $readACLList.IdentityReference + "," + $readACLList.FileSystemRights 
      add-content -value $a -path $outputACLInfo 
     } 
     } 
    } 
} 

回答

8

递归是你的朋友。试试这个:

$maxDepth = 3 

function TraverseFolders($folder, $remainingDepth) { 
    Get-ChildItem $folder | Where-Object { $_.PSIsContainer } | ForEach-Object { 
    if ($remainingDepth -gt 1) { 
     TraverseFolders $_.FullName ($remainingDepth - 1) 
    } 
    } 
} 

TraverseFolders "C:\BASE\PATH" $maxDepth 

编辑:现在我明白你的意思。要检查给定路径的前三个父文件夹,请尝试以下操作:

$server = "\\server\" 
$path = ($args[0] -replace [regex]::escape($server), "").Split("\\")[0..2] 
for ($i = 0; $i -lt $path.Length; $i++) { 
    Get-ACL ($server + [string]::join("\", $path[0..$i]) 
} 
+0

感谢您的回复Ansgar。 输出似乎不是我所期望的。也许我没有说清楚。当传递给脚本的路径时,它只会将文件夹的ACL信息提升至前3级。例如,

 path=\\server\sharefolder0 
user1486134

+0

例如,PATH = \\服务器\ sharefolder0传递给脚本,它将得到folder'ACL进行到第3级 \\服务器\ sharefolder0 \ folder00 \\服务器\ sharefolder0 \ FOLDER01 \ folder11 \\ server \ sharefolder1 \ folder00 \ folder01 \\ server \ sharefolder1 \ folder01 \ folder11 \\ server \ sharefolder2 \ folder00 \\ server \ sharefolder2 \ folder01 \ folder11 – user1486134

+0

查看已更新的回答。 –

相关问题