Try-catch не надежно фиксирует все ошибки. Try-catch на get-ChildItem
не сообщает обо всех ошибках доступа, о которых было сообщено за пределами try-catch.
Редактировать: неверно, что try-catch ненадежен, и есть звукпричина, по которой сообщалось только об одной ошибке. См. Мой комментарий к принятому ответу, чтобы видеть мое недоразумение позади этого вопроса.
В Windows 10 Pro 64, выполняющей PowerShell 5.1, этот сценарий:
$sScriptName = "ErrorTest.ps1"
write-host ("I will get the file structure of ""C:\Windows\System32"", but this yields two access-denied errors:")
$aoFileSystem = @(get-ChildItem "C:\Windows\System32" -recurse -force)
write-host ("I will now do it again and trap for those errors. But I only get one of them:")
try {$aoFileSystem = @(get-ChildItem $sPath -recurse -force -ErrorAction Stop)}
catch [System.UnauthorizedAccessException]
{$sErrorMessage = $_.ToString()
write-host ("System.UnauthorizedAccessException: " + $sErrorMessage.substring(20, $sErrorMessage.length - 32))}
, работающий в ISEкак администратор получает эти выходные данные:
PS C:\WINDOWS\system32> D:\<path>\ErrorTest.ps1
I will get the file structure of "C:\Windows\System32", but this yields two access-denied errors:
get-ChildItem : Access to the path 'C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5' is denied.
At D:\<path>\ErrorTest.ps1:5 char:19
+ ... aoFileSystem = @(get-ChildItem "C:\Windows\System32" -recurse -force)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Windows\Syst...che\Content.IE5:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
get-ChildItem : Access to the path 'C:\Windows\System32\LogFiles\WMI\RtBackup' is denied.
At D:\<path>\ErrorTest.ps1:5 char:19
+ ... aoFileSystem = @(get-ChildItem "C:\Windows\System32" -recurse -force)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Windows\Syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
I will now do it again and trap for those errors. But I only get one of them:
System.UnauthorizedAccessException: C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5
PS C:\WINDOWS\system32>
Я хочу регистрировать ошибки доступа, но когда я пытаюсь их перехватить, я получаю только первую. Что мне нужно сделать, чтобы второй отобразился, когда я их поймаю?
Редактировать: я получил сообщение о том, что мне нужно отредактировать свой вопрос, чтобы объяснить, чем он отличается от Может ли PowerShell перехватывать ошибки в GetChildItem и продолжать зацикливание? . Поэтому я повторю здесь то, что я сказал в ответ на комментарий ниже от Scepticalist. Этот вопрос для get-ChildItem
в цикле ForEach
. Моя проблема не связана с такой петлей. Тем не менее, я попробовал что-то из принятого ответа, используя -ErrorAction SilentlyContinue
, но это скрывает ошибки, не фиксируя их. Однако в решении, которое я нашел и собираюсь опубликовать в качестве ответа, я использую -ErrorAction SilentlyContinue
в сочетании с -ErrorVariable
.