Отлов UnauthorizedAccessError в PowerShell - PullRequest
1 голос
/ 20 марта 2020

Я хотел бы найти все файлы в указанном каталоге и сохранить полный путь к любым папкам / файлам, которые выдают ошибку отказа в доступе (как показано ниже).

Get-ChildItem : Access to the path 'C:\ProgramData\Microsoft\Crypto\SystemKeys' is denied.
At line:1 char:1
+ Get-ChildItem "C:\ProgramData\Microsoft\Crypto\SystemKeys"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\ProgramData\...ypto\SystemKeys:String) [Get-ChildItem], Unauthoriz
   edAccessException
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

Я использую команду:

$Allfiles = Get-ChildItem -Path $Directories -Recurse -Force -File | % { $_.FullName }

У меня было несколько идей:

  • Анализ переменной $error для DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand exceptions
  • Использование параметров -ErrorVariable и -ErrorAction
  • Использование try{} catch{}
  • с использованием $ _

Но я не добился большого прогресса в этом, и мне было интересно, если вы может помочь.

Спасибо,

TheCube

1 Ответ

0 голосов
/ 20 марта 2020
# Use -ErrorVariable errs to collect all errors in variable $errs.
# -ErrorAction SilentlyContinue silences display output of the errors.
$allfiles = Get-ChildItem -Path $Directories -Recurse -Force -File -ErrorVariable errs -ErrorAction SilentlyContinue

# List all paths that resulted in an unauthorized-access exception.
# Note: Given that other errors are unlikely to occur, you could omit the 
#       `where` call.
$errs | where { $_.Exception -is [UnauthorizedAccessException] } |
  select -ExpandProperty TargetObject
...