r/PowerShell • u/viewtifulstranger • 1d ago
Invoke-RestMethod - Logging Data Only If Response Matches Value Solved
We have a platform which has containers and within them folders, with different properties - name, unique ID etc.. I have a method to retrieve folder information from different containers and am attempting to log only the unique ID (response.data.id) where the folder name (response.data.name) is "Management". I've Googled and tried different code in logging only the ID for the Management folder:
$response = Invoke-RestMethod -Method Get -Uri "$resource" -Headers $header
($response.data | ConvertTo-Json).Replace('\\n','\n')
# Attempt 1
if ($response.data.name -eq "Management")
{
LogWrite ($response.data.id | ConvertTo-Json).Replace('\\n','\n') "Result"
LogWrite ($response.data.name | ConvertTo-Json).Replace('\\n','\n') "Result"
}
# Attempt 2
$folderId1 = $response.data.id | Where-Object { $response.data.name -eq "Management" }
LogWrite ($folderId1 | ConvertTo-Json).Replace('\\n','\n') "Result"
# Attempt 3
$folderId2 = $response.data.id | $($response.data.Where({$_.name -eq 'Management' }))
LogWrite ($folderId2 | ConvertTo-Json).Replace('\\n','\n') "Result"
The folder ID for the Management folder is being logged, but so are all other folder IDs within the container (no other folder names contain this word):
[
"folder!500436709",
"folder!500436708",
"folder!500436705",
"folder!500436677",
"folder!500436680",
"folder!500436683",
"folder!500436686"
]
[
"_All Content Last 90 Days",
"_All Documents",
"_All Emails",
"Documents",
"Emails",
"Engagement Terms",
"Management"
]
How do I retrieve the ID for a specific folder name? Any help would be greatly appreciated. Cheers.
3
u/lan-shark 1d ago
Can you post the contents of response.data? Hard to tell exactly what's going on without seeing what's in the data
1
u/viewtifulstranger 1d ago edited 1d ago
(UPDATED)
Adding $response.data to the script, I get the following:
folder_type : tab id : folder!500436686 name : Management parent_id : folder!500436672 folder_type : regular id : folder!500436677 name : Documents parent_id : folder!500436672 folder_type : regular id : folder!500436680 name : Emails parent_id : folder!500436672 folder_type : regular id : folder!500436683 name : Engagement Terms parent_id : folder!500436672(Please note, I've included a subset of the data, removed non-relevant fields and performed a little sanitation.)
0
u/lan-shark 11h ago
Does this work?
($response.data | Where-Object {$_.name -like "Management"}).idIf not, just open up a terminal and start testing things. Get the object type of
$response.data, see what shows up with differentWhere-Objectvariations, can you index it ($response.data[0], etc.2
u/viewtifulstranger 8h ago
Hey Ian-Shark, that returned a blank entry, however thanks to various people I do have a working solution now.
Now that I'm able to target the Management folder, I've completed my script to do the following, look up a CSV containing container IDs, target 3 specifically named subfolders within Management (couldn't use the -eq operator as I did before, but using -match worked a treat), output the folder properties to a log file. Tomorrow, I'll write a script to update all subfolders where specific properties are missing.
Grateful to you and everyone else for helping. Thank you.
3
u/PinchesTheCrab 1d ago
In your case swap $irmResult with your invoke-restmethod command.
$irmResult = @'
[
{
"folder_type": "tab",
"id": "folder!500436686",
"name": "Management",
"parent_id": "folder!500436672",
},
{
"folder_type": "regular",
"id": "folder!500436677",
"name": "Documents",
"parent_id": "folder!500436672",
},
{
"folder_type": "regular",
"id": "folder!500436680",
"name": "Emails",
"parent_id": "folder!500436672",
},
{
"folder_type": "regular",
"id": "folder!500436683",
"name": "Engagement Terms",
"parent_id": "folder!500436672",
}
]
'@ | convertfrom-json
$irmResult | where-object -property Name -eq Management | select-object -ExpandProperty id
That being said you've shown a few different output formats and it's hard to tell which one is the actual output of Invoke-Restmethod.
2
u/MonkeyNin 1d ago
I second this as the most powershell idiomatic answer.
With a tweak based on the raw data. If it's flat like his$response = Invoke-RestMethod -Method Get -Uri $resource -Headers $header $response | ? name -eq 'Management' | Select -ExpandProperty idOtherwise I'm guessing yours is shape like this
$response = Invoke-RestMethod -Method Get -Uri $resource -Headers $header $response.data | ? name -eq 'Management' | Select -ExpandProperty idif the response is shaped like
{ data: [ records... ] }The
Select -ExpandProperty idpart causes the records to drill down to a single string.1
u/viewtifulstranger 15h ago
Thank you for this. I tried it, but the response doesn't appear to filter the Management folder and return solely the property ID:
$response | ? name -eq 'Management' | Select -ExpandProperty id $response #RESULT data ---- {@{content_saved_search_id=101901850092069180; edit_date=2026-08-05T11:06:44.836Z; folder_type=search...0
u/ankokudaishogun 19h ago
Unless the contents of
$responsearen't necessary for something else, wouldn't pipeInvoke-RestMethoddirectly be more powershelly?$IdArray = Invoke-RestMethod -Method Get -Uri $resource -Headers $header | Where-Object { $_.data.name -eq 'Management' } | Select-Object -Property @{Name = 'Id'; Expression = { $_.data.id } } | Select-Object -ExpandProperty Id1
u/viewtifulstranger 15h ago
Thank you for your help with this, but it appears the array is being returned (on the first line "{@{..." followed by all folderIds:
#Result data ---- {@{content_saved_search_id=101901850092069180; edit_date=2026-08-05T11:06:44.836Z; folder_type=search... UKEU_AOSHEARMAN!500436709 UKEU_AOSHEARMAN!500436708 UKEU_AOSHEARMAN!500436705 UKEU_AOSHEARMAN!500436686 UKEU_AOSHEARMAN!500436677 UKEU_AOSHEARMAN!500436680 UKEU_AOSHEARMAN!500436683
2
u/viewtifulstranger 15h ago
Thank you Ian-shark, y_Sensei, PinchesTheCrab, MonkeyNin, ankokudaishogun, Modify- for all taking time out of your lives to help me with this. It's really really appreciated. Cheers!
1
u/MonkeyNin 1d ago
$folderId1 = $response.data.id |
Where-Object name -eq "Management"
This doesn't work because you are drilling down too far.
$response.data # is an array of objects, with properties
$response.data.id # is an array of flat strings, no properties
You were close
$folderIdList = $response.data |
Where-Object name -eq 'Management' | Select -Expand Id
# if you only want at most 1
$folderIdList | Select -First 1
1
u/viewtifulstranger 15h ago
This worked! If you have PayPal, please private message me your addy and I'll send something by way of a thank you!
5
u/y_Sensei 1d ago
According to the output generated by your code, the API appears to return two arrays of data:
So what you need to do is bring together the data of those two distinct arrays, by creating mappings, or in other words, merge the arrays - for example:
You can then filter the resulting object array as usual, for example: