我有一个PowerShell脚本,它在for循环中使用GetChildItem通过文件系统递归。随着它的传播,它正在修复它找到的ACL问题(大多数人已经阻止了BUILTIN \ Administrators帐户)...但是有一些它无法处理它自己,就像我得到[System.UnauthorizedAccessException]那样是一个明确的“拒绝”ACE。
代码行如下所示:
foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction Continue) {
...
}
当它在无法读取的路径上发现时,会出现此异常:
Get-ChildItem:拒绝访问路径“C:\ TEMP \ denied”。在 Fix-ACLs.ps1:52 char:31 + foreach(Get-ChildItem中的$ file<<<< $ dirRoot -Recurse -ErrorAction 继续){ + CategoryInfo:PermissionDenied: (C:\ TEMP \ denied:String)[Get-ChildItem],未经授权的AccessException + FullyQualifiedErrorId: DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
我想尝试/捕获或捕获错误,以便我可以就地修复ACL(即,删除“拒绝”),并且 - 最重要的是 - 继续循环而不会丢失我的位置。对我有什么建议吗?
答案 0 :(得分:8)
你使用过silentlycontinue吗?
foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction silentlycontinue) {
...
}
答案 1 :(得分:5)
询问怎么样?
foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction Inquire) {
...
}
可能打开第二个PS窗口来解决错误,然后在第一个PS窗口中继续命令,选择Y继续。
您也可以使用ErrorVariable
foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorVariable a) {
...
}
Get-Variable a或$ a将显示该命令产生的所有错误。您还可以使用+ variablename(+ a)将错误添加到现有变量。
foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorVariable +a) {
...
}
答案 2 :(得分:0)
我会用它来
ForEach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction silentlycontinue) {
...
}
然后,您可以过滤$ Error以获得权限拒绝类型错误:
$permError += $Error | Where-Object { $_.CategoryInfo.Category -eq 'PermissionDenied' }
ForEach($deniedAccess in $permError)
{
$deniedAccess.CategoryInfo.TargetName | Do Stuff
}