我仍然对Powershell还是陌生的,至今还找不到任何东西。我正在对URI运行REST GET请求,由于没有找到资源,我实际上知道从服务器返回404。
我希望能够运行一个条件检查条件是否为404,如果是这种情况,则跳过该条件进行进一步处理,但是当我将请求分配给变量,然后再调用它时,它只会给出我所要求的内容。我以前从未用其他语言看到过这样的东西……
我的基本前提如下。我首先获取所有组名,然后遍历该名称数组,将当前名称包含在新的URL中,并对该特定组进行额外的请求,以查找始终具有相同名称的SHIFT。如果该组没有按名称列出的班次,我想跳到下一个组,否则更改该新找到的班次对象的某些属性。
这是我的代码的样子,如您所见,它的行为不正确
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$user = '******'
$pass = ConvertTo-SecureString '*******' -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
$req = Invoke-WebRequest -Credential $cred -Uri https://********-np.xmatters.com/api/xm/1/groups
$res = ConvertFrom-Json $req.Content
$content = $res.data
$base = "https://********-np.xmatters.com/api/xm/1/groups"
$group_name = $content[0].targetName
$path = "$base/$group_name/shifts/MAX-Default Shift"
$shift = Invoke-RestMethod -Credential $cred -Uri $path
Write-Host '-----------------------'
Write-Host $shift
Write-Host '-----------------------'
... RESPONSE BELOW ....
Invoke-RestMethod : The remote server returned an error: (404) Not Found.
At \\MMFILE\********$\MyDocuments\Group Supers PReliminary.ps1:16 char:10
+ $shift = Invoke-RestMethod -Credential $cred -Uri $path
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
-----------------------
@{id=***********; group=; name=MAX-Default Shift; description="; start=2018-08-21T04:00:00.000Z; end=2018-08-22T04:00:00.000Z; timezone=America/New_York; recurrence=;
links=}
-----------------------
PS C:\WINDOWS\system32>
我想做的是用简写代码if $shift.code == 404 ... skip ... else ... run additional query
答案 0 :(得分:2)
您需要使用try ... catch。
$code = ""
try{
$shift = Invoke-RestMethod -Credential $cred -Uri $path
}
catch{
$code = $_.Exception.Response.StatusCode.value__
}
if($code -eq "404")
{
continue
# Other things
}
else
{
Write-Host '-----------------------'
Write-Host $shift
Write-Host '-----------------------'
}
答案 1 :(得分:1)
您可以通过Try..Catch
禁止显示错误消息,从而允许脚本继续执行:
Try {
$Shift = Invoke-RestMethod http://www.google.com/fakeurl -ErrorAction Stop
#Do other things here if the URL exists..
} Catch {
if ($_.Exception -eq 'The remote server returned an error: (404) Not Found.') {
#Do other things here that you want to happen if the URL does not exist..
}
}
请注意,这将隐藏Invoke-ResetMethod
中的所有终止错误。然后,您可以使用if
语句查看异常是否为404,然后相应地执行进一步的操作。