Many times when working with Powershell Modules, I’m presented with an object that contains data that I want, but it’s embedded inside nested hash tables, or isn’t quite storing the data in a way that’s useful for me to work with.
For example, let’s take the output of a function from Rubrik’s Powershell Module – “Get-RubrikSLA“. This command will output all the information about various backup policies, but doesn’t quite present it in a usable format for me (Say to output to a CSV file).
id : 1d3e635d-ad98-438a-9738-a0098a3ff987
primaryClusterId : 98003aa6-c7e9-4410-a79e-3d5c72f3109e
name : Daily-Weekly
frequencies : @{daily=; weekly=}
allowedBackupWindows : {}
firstFullAllowedBackupWindows : {}
maxLocalRetentionLimit : 2419200
archivalSpecs : {}
replicationSpecs : {}
numDbs : 0
numOracleDbs : 0
numFilesets : 0
numHypervVms : 0
numNutanixVms : 0
numManagedVolumes : 0
numStorageArrayVolumeGroups : 0
numWindowsVolumeGroups : 0
numLinuxHosts : 0
numShares : 0
numWindowsHosts : 0
numVms : 180
numEc2Instances : 0
numVcdVapps : 0
numProtectedObjects : 180
isDefault : False
uiColor : #ae00ff
showAdvancedUi : True
advancedUiConfig : {@{timeUnit=Daily; retentionType=Daily}, @{timeUnit=Weekly; retentionType=Weekly}}
id : 4670304c-3011-465b-9bbf-32c8e8b45ea0
primaryClusterId : 98003aa6-c7e9-4410-a79e-3d5c72f3109e
name : Daily-Weekly-SQL
frequencies : @{daily=; weekly=; monthly=; yearly=}
allowedBackupWindows : {}
firstFullAllowedBackupWindows : {}
maxLocalRetentionLimit : 63072000
archivalSpecs : {}
replicationSpecs : {}
numDbs : 157
numOracleDbs : 0
numFilesets : 0
numHypervVms : 0
numNutanixVms : 0
numManagedVolumes : 0
numStorageArrayVolumeGroups : 0
numWindowsVolumeGroups : 0
numLinuxHosts : 0
numShares : 0
numWindowsHosts : 0
numVms : 0
numEc2Instances : 0
numVcdVapps : 0
numProtectedObjects : 157
isDefault : False
uiColor : #ff574
showAdvancedUi : True
advancedUiConfig : {@{timeUnit=Daily; retentionType=Daily}, @{timeUnit=Weekly; retentionType=Weekly}, @{timeUnit=Monthly; retentionType=Monthly}, @{timeUnit=Yearly;
retentionType=Yearly}}
id : 4722fced-b920-49e3-975c-5cbc19927022
primaryClusterId : 98003aa6-c7e9-4410-a79e-3d5c72f3109e
name : Remote-FS
frequencies : @{daily=; weekly=; monthly=}
allowedBackupWindows : {@{startTimeAttributes=; durationInHours=12}}
firstFullAllowedBackupWindows : {}
localRetentionLimit : 63072000
maxLocalRetentionLimit : 62208000
archivalSpecs : {@{locationId=e7cd50b6-8ed1-4067-bf7e-93c51627b043; archivalThreshold=1}}
replicationSpecs : {}
numDbs : 0
numOracleDbs : 0
numFilesets : 47
numHypervVms : 0
numNutanixVms : 0
numManagedVolumes : 0
numStorageArrayVolumeGroups : 0
numWindowsVolumeGroups : 0
numLinuxHosts : 0
numShares : 0
numWindowsHosts : 45
numVms : 0
numEc2Instances : 0
numVcdVapps : 0
numProtectedObjects : 45
isDefault : False
uiColor : #256d2d
showAdvancedUi : True
advancedUiConfig : {@{timeUnit=Daily; retentionType=Daily}, @{timeUnit=Weekly; retentionType=Weekly}, @{timeUnit=Monthly; retentionType=Monthly}}
I’m interested in the frequencies of the backups, the name of the SLA Domain, and not much else. If we try to export the data right now using Select-Object we will see that the frequencies are inside an embedded hash table. When running “Export-CSV”, we’ll just be presented with this in our row –
frequencies : @{daily=; weekly=; monthly=}
Really, the data we are interested in is inside another has table called Daily. Drilling down, we can see that 'Daily' contains a the key;value pair Frequency,Retetention
PS /Users/nshores/Documents/PCCI> $s.frequencies.daily
frequency retention
--------- ---------
1 10
The way to work around this limitation is to create a script that utilizes custom PS objects. This script will loop over the object we examined above, and push the data we want from each nested hash table, into a custom object called $slaOBjRecord . This object will then be added to an array, $sla_report_array.
Using this technique we end up with a result that looks like the table below, and can be used with export-csv without any issue.
PS /Users/nshores/Documents/PCCI> $sla_report_array | ft Name Weekly Freq Monthly Freq Objects Weekly Retention Monthly Retention Daily Retention Daily Freq ---- ----------- ------------ ------- ---------------- ----------------- --------------- ---------- Daily-Weekly 1 180 4 10 1 Daily-Weekly-SQL 1 1 157 4 3 10 1 Remote-FS 1 1 45 4 24 10 1 Daily-Monthly 1 1 48 4 3 10 1 Daily-SAP 1 1 1 4 3 7 1 Test-VMs 1 1 25 4 3 10 1