9

I need to get success and/or error status code from a request using power shell. And i'm always getting a blank status.

I have tried with Invoke-WebRequest and Invoke-RestMethod. I have sucess on the call but can't find a way of getting the status code.

Here how is currently written:

$resource = "some url"
$Logfile = "C:/path/log.log"

function LogWrite
{
    Param([string]$logstring)

    Add-content $logfile -value $logstring
}

Try
{
    $Response = Invoke-WebRequest -Method Post -Uri $resource 
    Write-Output("Success.")
    LogWrite $Date
    LogWrite SuccessOnCall
    LogWrite  $Response.StatusCode
}
Catch
{
    $ErrorMessage = $_.Exception.Message
    Write-Output($ErrorMessage)
    $FailedItem = $_.Exception
    Write-Output($FailedItem)
    LogWrite $Date
    LogWrite ErrorOnCall
    LogWrite $ErrorMessage
    Break
}

I have also tried:

LogWrite "StatusCode:" $Response.Exception.Response.StatusCode.value__ 

I used this question (and other links) : Invoke-Restmethod: how do I get the return code?

Trying to solve this, my log does write "SuccessOnCall" but the StatusCode is blank.

Thank you.

AndreG
  • 113
  • 1
  • 1
  • 7
  • I can't replicate this using www.google.com as the URL. Using a get succeeds and a post fails but the status code is written correctly to the log in both cases. `SuccessOnCall 200 ErrorOnCall The remote server returned an error: (405) Method Not Allowed.` – StephenP Apr 19 '19 at 01:09
  • 2
    As an aside: Please avoid pseudo method syntax: instead of `Write-Output(arg1, ...)`, use `Write-Output arg1 ...` - PowerShell cmdlets and functions are invoked like _shell commands_ , not like _methods_. That is, no parentheses around the argument list, and _whitespace_-separated arguments (`,` constructs an _array_ as a _single argument_). Better yet, instead of calling `Write-Output`, use [_implicit_ output](https://stackoverflow.com/a/55665963/45375). – mklement0 Apr 19 '19 at 02:47
  • 1
    You'll want to refer to `$_.Exception.Response.StatusCode.value__` inside the `catch` block – Mathias R. Jessen Apr 19 '19 at 09:13

2 Answers2

17

did you try pipe'ing with select-object ?

Invoke-WebRequest -Uri apiEndpoint -UseBasicParsing | Select-Object StatusCode

output

StatusCode
 ----------
   200

or just to get status code

Invoke-WebRequest -Uri apiEndpoint -UseBasicParsing | Select-Object -Expand StatusCode

output

200

to handle unsuccessful cases, on PowerShell v#7 + include -SkipHttpErrorCheck parameter or you may need to make use of $Error array to get most recent error and access properties accordingly.

ManiVI
  • 556
  • 1
  • 5
  • 18
  • 4
    How can I parse output if there is an error? For example, If code is 200, all okay, i get "200" as output. But if 404, I get several error strings even with "Select-Object -Expand StatusCode" :) – rGA145 Oct 13 '20 at 11:29
  • open to exploration :) – ManiVI Oct 16 '20 at 22:22
  • https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.2#example-7-catch-non-success-messages-from-invoke-webrequest – BobtheMagicMoose Jun 10 '22 at 16:39
0
curl -Uri 'google.com' | select-object StatusCode