Dynamic Key Value Pairs (Members)
Aus Wiki-WebPerfect
Version vom 22. Oktober 2021, 13:10 Uhr von Admin (Diskussion | Beiträge)
In the following example I create a PowerShell object with dynamic Key Value Pairs of the first 10 files in the path "C:\Windows".
The key is filename "Name" and keyvalue is the size "Length".
# Function to loop over all properties and add the Keys and Values to the "Template" PSCustomObject Function Add-DynamicKeyValues { param( [Parameter(Mandatory=$true,HelpMessage="PSCustomObject template and result")] [PSCustomObject]$Result, [Parameter(Mandatory=$true,HelpMessage="Object with multiple properties")] [System.Object]$InputObject, [Parameter(Mandatory=$false,HelpMessage="Object with multiple properties")] [string]$ObjectPath = "Metrics", [Parameter(Mandatory=$true,HelpMessage="Property to extract as the Key")] [string]$Key, [Parameter(Mandatory=$false,HelpMessage="String to add as suffix to the Key name")] [string]$KeySuffix, [Parameter(Mandatory=$true,HelpMessage="Property to extract as the Value")] [string]$KeyValue ) Process { Foreach ($_InputObject in $InputObject) { $Result.$ObjectPath.Add(($_InputObject.($Key) + $KeySuffix).ToLower(), $_InputObject.($KeyValue)) } } } # Define PSCustomObject as a "Template" for the structure $Result = [PSCustomObject]@{ PSTypeName = "Metric" Measure = "asset_appliance_oneview" Metrics = @{} } # Use the function $Files = (Get-ChildItem -Path "C:\Windows" -File | Select-Object -First 10) Add-DynamicKeyValues -result $result -InputObject $Files -ObjectPath "Metrics" -Key "Name" -KeyValue "Length"
Result as JSON Object to get the depth
{ "Measure": "asset_appliance_oneview", "Metrics": { "bfsvc.exe": 82944, "dfsradmin.exe.config": 1315, "hh.exe": 18432, "dfsradmin.exe": 232960, "explorer.exe": 4388592, "mib.bin": 43131, "lsasetup.log": 1380, "helppane.exe": 1072128, "bootstat.dat": 67584, "dtcinstall.log": 4056 } }
With Type Conversion
If you want using this function in a monitoring context where the data type is important, you can add the datatype and remove units "MB, GB, ..".
- Replace following line in the function above:
$Result.$ObjectPath.Add(($_InputObject.($Key) + $KeySuffix).ToLower(), $_InputObject.($KeyValue))
- With following line:
$Result.$ObjectPath.Add(($_InputObject.($Key) + $KeySuffix).ToLower(), [single]($_InputObject.($KeyValue) -replace "(\d+\.*\d*).*", '$1'))