如何忽略Invoke-Webrequest错误消息

时间:2018-10-25 14:11:43

标签: powershell

在我看来,我有一个奇怪的情况,即使我试图忽略它,PowerShell也会引发错误。同样奇怪的是,这是一个终止错误,意味着整个功能都会停止,即使它不应该

这是我的功能,我使用该功能通过使用haveibeenpwned API来破坏公司的电子邮件帐户。

function Get-Pwned {

    Param(
        [Parameter( Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
        [string[]]$EmailAddress,
        [ValidateNotNullOrEmpty()]
        [string]$API = "https://haveibeenpwned.com/api/v2/breachedaccount/"
    )

    Begin { 

        $ErrorActionPreference = "SilentlyContinue"

        # Setzen der Anfrage auf TLS 1.2, da TLS 1.0 nicht akzeptiert wird
        [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

        # ResultArray
        $Pwned = @()
    }

    # über Mail Adressen loopen und schauen ob 
    Process {
        foreach ($Email in $EmailAddress)
        {
            $Uri = "{0}{1}" -f $API, $Email
            Write-Host $Uri
            Invoke-WebRequest $Uri -ea Ignore | select -expand Content | ConvertFrom-Json |
                        foreach { 
                            $Pwned += [PSCustomObject]@{ 
                                Email = $Email
                                Name = $_.Name
                                Domain = $_.Domain
                                BreachDate = $_.BreachDate 
                            }
                        }
        }
    }

    End {
        # Return Object
        $Pwned
    }
}

API的Documentation说,如果没有发现电子邮件地址违规,我将获得状态码404作为回报。

我的问题是,每当发生这种情况时,我都会收到一个完全终止的错误。因此,基本上,当未伪造电子邮件地址(这是一件好事)时,脚本的执行将完全停止(这不是一件好事)。

如您所见,我正在尝试执行$ErrorActionPreference = "SilentlyContinue"-ea Ignore,但是我仍然收到错误消息,并且脚本仍然停止。

我使用这样的功能:

Get-Mailbox foo@bar.com | select -expand EmailAddresses | ? { $_.startswith("smtp:") } | % { $_.split(":")[1] } | Get-Pwned

如果要测试它,只需执行以下操作即可:

"email@server.com", "email2@server.com" | get-pwned

那是我得到的错误:

  

Invoke-WebRequest:远程服务器上的einen Fehlerzurückgegeben:   (404)Nicht gefunden。在   \ server \ Powershell-Scripts \ Functions \ Get-Pwned.ps1:27   蔡琴:13   +调用WebRequest $ Uri -ea忽略|选择-expand目录...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(System.Net.HttpWebRequest:HttpWebRequest)[Invoke-WebRequest],   WebException       + FullyQualifiedErrorId:WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

当出现错误消息时,如何使我的脚本不停止?如何忽略它,以使我不会收到n条错误消息?

编辑: 我刚刚注意到,如果我这样做,它会起作用:

$addr = "email@server.com", "email2@server.com"
Get-Pwned $addr

为什么它不能与管道输入一起使用?

1 个答案:

答案 0 :(得分:0)

我无法解释为什么设置-ErrorAction时仍然出现脚本终止错误,但是您可以通过将命令包装在try / {{1}中来解决此问题。 }区块:

catch

作为脚注,try { Invoke-WebRequest -Uri $Uri -ErrorAction Stop | Select-Object -ExpandProperty Content | ConvertFrom-Json | ForEach-Object { $Pwned += [pscustomobject]@{ Email = $Email Name = $_.Name Domain = $_.Domain BreachDate = $_.BreachDate } } } catch { Write-Warning -Message "Error returned! $_" } 优先于-ErrorAction