PowerShell能否在GetChildItem中捕获错误并继续循环?

时间:2011-08-04 13:58:13

标签: powershell try-catch acl

我有一个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(即,删除“拒绝”),并且 - 最重要的是 - 继续循环而不会丢失我的位置。对我有什么建议吗?

3 个答案:

答案 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
}