PowerShell:无法捕获由get-content引发的UnauthorizedAccessException。

5

我试图捕获 System.UnauthorizedAccessException 异常。该异常会在用户没有对特定文件的读取权限时发生。

$fwlog = $env:SystemRoot + "\system32\logfiles\firewall\pfirewall.log"

if(Test-Path $fwlog) 
{
    try
    {
        Get-Content -ReadCount 10 -Path $fwlog
    }

    catch [System.UnauthorizedAccessException]
    {
        Write-Host "caught"
    }
}
else 
{
    write-host "File does not exist"
}

但是我一直收到这个错误信息:
Get-Content : Access to the path 'C:\Windows\system32\logfiles\firewall\pfirewall.log' is denied.
At D:\SourceCode\PowerShell\FwLogParser.ps1:7 char:9
+         Get-Content -ReadCount 10 -Path $fwlog
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\Windows\syst...l\pfirewall.log:String) [Get-Content], UnauthorizedAccessException
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

我在这里做错了什么?


谢谢您的回答。我仍然不理解为什么它会出现 [Exception] 而不是更具体的 [System.UnauthorizedAccessException]。

$fwlog = $env:SystemRoot + "\system32\logfiles\firewall\pfirewall.log"
$ErrorActionPreference = "stop"

if(Test-Path $fwlog) 
{
    try
    {
        Get-Content -ReadCount 10 -Path $fwlog 
    }

    catch [System.UnauthorizedAccessException]
    {
        Write-Host "caught"
    }

    catch [Exception]
    {
        Write-Host "Caugth generic exception"
    }
}
else 
{
    write-host "File does not exist"
}
1个回答

9

try/catch语句只能捕获到终止错误。 您可以在脚本顶部使用以下命令,将所有错误设置为终止错误:

$erroractionPreference="stop"

@Shay Levy在这里提供了解释:https://dev59.com/jmsy5IYBdhLWcg3wsQFj#8381798


3
@Matze,在这种情况下,您可能不希望修改全局$ErrorActionPreference变量,而可以使用以下命令:Get-Content -ReadCount 10 -Path $fwlog -erroraction stop。该命令能够读取文件内容,并在读取过程中出现错误时停止执行。 - Loïc MICHEL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接