在我看来,我有一个奇怪的情况,即使我试图忽略它,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
为什么它不能与管道输入一起使用?
答案 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
。