Dynamic Key Value Pairs (Members): Unterschied zwischen den Versionen

Aus Wiki-WebPerfect
Wechseln zu: Navigation, Suche
Zeile 71: Zeile 71:
 
''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, .."''. <br>
 
''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, .."''. <br>
  
*Replace following line:
+
*Replace following line in the function above:
 
<source lang="powershell">$Result.$ObjectPath.Add(($_InputObject.($Key) + $KeySuffix).ToLower(), $_InputObject.($KeyValue))</source>
 
<source lang="powershell">$Result.$ObjectPath.Add(($_InputObject.($Key) + $KeySuffix).ToLower(), $_InputObject.($KeyValue))</source>
 
*With following line:
 
*With following line:

Version vom 22. Oktober 2021, 13:10 Uhr

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'))