How do I extract the output of Invoke-RestMethod into distinct variables

prodman picture prodman · May 5, 2019 · Viewed 7.6k times · Source

Somewhat of a Powershell noob here ..

I am working on Microsoft's API for Windows Defender ATP. I need to understand how to extract specific values from a custom powershell object which is returned as the output of Invoke-RestMethod.

$webResponse = Invoke-RestMethod  -Method Get -Uri $url -Headers $headers 
Write-Output $webResponse

This produces the following:

@odata.context value -------------- ----- https://api.securitycenter.windows.com/api/$metadata#Machines {@{id=f7749cafd089c66e53g21332ba0b426f6f88c953; computerDnsName=desktop-h2134uc; firstSeen=4/30/19 10:03:40 PM; lastSeen=5/3/19 4:15:17 AM; osPlatform=Windows10; osVersion…

My question is - how can I extract the individual field values for id, computerDnsName etc.

Thanks!

Answer

Moerwald picture Moerwald · May 5, 2019
$response = Invoke-WebRequest -Uri www.google.at
$response | Get-Member
TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject

Name              MemberType Definition
----              ---------- ----------
...
Headers           Property   System.Collections.Generic.Dictionary[string,string]     Headers {get;}
Images            Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;}
InputFields       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;}
Links             Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;}
ParsedHtml        Property   mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent        Property   string RawContent {get;set;}
RawContentLength  Property   long RawContentLength {get;}
RawContentStream  Property   System.IO.MemoryStream RawContentStream {get;}
Scripts           Property       Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;}
StatusCode        Property   int StatusCode {get;}
StatusDescription Property   string StatusDescription {get;}

Via Get-Member you'll know which properties this object supports. Then you can call these properties on the given object:

$response.StatusCode
200

If you want to select multiple properties you can use Select-Object:

 $response | select statuscode, statusdescription

 StatusCode StatusDescription
 ---------- -----------------
   200 OK

You can, of course, store the results of Select-Object in a variable.

More of less the same can be used fro Invoke-RestMethod:

  Invoke-RestMethod -Uri https://blogs.msdn.microsoft.com/powershell/feed/ | Get-Member

TypeName: System.Xml.XmlElement

Name                 MemberType            Definition
----                 ----------            ----------
...

comments             Property              System.Object[] comments {get;}
creator              Property              System.Xml.XmlElement creator {get;}
description          Property              System.Xml.XmlElement description {get;}
encoded              Property              System.Xml.XmlElement encoded {get;}

...

The properties you can select/use depends on the format returned in the response body. In the above example, you have an XML body, but it could also be JSON or something else.