2012-06-20 53 views
0

我有一个奇怪的情况,我无法弄清楚问题所在。我希望获取给定路径的所有子目录的ACL和AccessRules。如果我单独做这些,我没有得到任何错误PowerShell路径不存在foreach脚本

gci -recurse | Where-Object { $_.PSIsContainer } | Get-Acl | Format-List | Out-File C:\temp\permission.txt 
gci -recurse | Where-Object { $_.PSIsContainer } | Get-Acl | foreach {$_.GetAccessRules($true, $true, [System.Security.Principal.NTAccount])} | Out-File C:\temp\permission1.txt -Append 

不过,我想在foreach循环中执行此,操作和更好地处理如何生成的文件。这里就是我想在我的脚本做:

sl c:\test_folder 
gci * -Recurse | Export-Csv c:\temp\dir.csv -Force 
$pastas = gci -Recurse | where {$_.PsIsContainer} 
if (Test-Path C:\temp\permission.txt) 
{ 
    ri c:\temp\permission.txt 
} 
foreach ($pasta in $pastas) 
{ 
    $pasta 
    Test-Path $pasta 
    $acl = get-acl $pasta 
    $acl | format-list | Out-File -FilePath c:\temp\permission1.txt -Append 
    $acl.GetAccessRules($true, $true, [System.Security.Principal.NTAccount]) | Out-File -FilePath c:\temp\permission1.txt -Append 
} 

,而我在foreach的文件夹直接在$pastas变量,则Test-Path回报true根处理。但是,在第一个子目录中,Test-Path返回false,但文件夹确实存在。在get-acl上,我得到PathNotFound例外:

Get-Acl : Não é possível localizar o caminho 'Exportacao' porque ele não existe. 
Em C:\Temp\Script Get Info.ps1:12 caractere:17 
+ $acl = get-acl <<<< $pasta 
    + CategoryInfo   : ObjectNotFound: (:) [Get-Acl], ItemNotFoundException 
    + FullyQualifiedErrorId : GetAcl_PathNotFound_Exception,Microsoft.PowerShell.Commands.GetAclCommand 

我在做什么错?

回答

2
sl c:\test_folder 
gci * -Recurse | Export-Csv c:\temp\dir.csv -Force 
$pastas = gci -Recurse | where {$_.PsIsContainer} 
if (Test-Path C:\temp\permission.txt) 
{ 
    ri c:\temp\permission.txt 
} 
foreach ($pasta in $pastas) 
{ 
    $pasta.FullName 
    Test-Path $pasta.FullName 
    $acl = get-acl $pasta.FullName 
    $acl | format-list | Out-File -FilePath c:\temp\permission1.txt -Append 
    $acl.GetAccessRules($true, $true, [System.Security.Principal.NTAccount]) | Out-File -  FilePath c:\temp\permission1.txt -Append 
} 

试试上面的脚本。

您的代码失败的原因是因为$ pasta是FileInfo对象,而Test-Path需要一个包含完整路径的字符串。

+0

Tks为你的时间和答案 – Pascal

2

尝试:

Test-Path $pasta.fullname 
    $acl = get-acl $pasta.fullname 
+0

tks为您的答案,这也是正确的。 Russllds是一个更完整一点,并且比你少得多点,所以我标记他是答案。 – Pascal

+1

没问题。我在这里帮忙。你不需要解释你的选择:) –

相关问题