PSLinuxUtils.psm1

<#
.SYNOPSIS
 
Function to convert text output from a shell command to objects
.DESCRIPTION
 
Converts text output from a shell command to objects. Useful for taking output from native commands for
even Python scripts and converting them to deserialized objects for use in PowerShell
.PARAMETER InputObject
 
The line of text that needs to be converted to an object
.EXAMPLE
ps
 
.EXAMPLE
 
ps | Convertto-Object | sort-object CPU
 
#>

function Convertto-Object
{
    [CmdletBinding()]
    param(
        [Parameter(Position=0, ValueFromPipeline=$true)]
        [object]
        $InputObject
    )

    Begin{
        $script:Objects = @()
        $script:Titles = @()
    }

    Process {
        $script:Objects += $InputObject
    }

    End {
    
        # first line should be property names
        $TitleString = $script:Objects[0]
        $script:Titles = Get-Title -TitleString $TitleString
        
        $startindex = 1

        # if titles are underscored, skip the underscore line
        if ($script:Objects[1] -match '---') {
            $startindex = 2
        }

        # parse each line to get the values and create objects
        $startindex .. ($script:Objects.Count - 1) | ForEach-Object {
                    
            $values = Get-Value -ValueString $script:Objects[$_]

            $map = @{}
            for($i=0; $i -lt $Titles.Count; $i++) {
                $map += @{$Titles[$i]=$values[$i]}                
            }

            New-Object -TypeName psobject -Property $map 
        }
    }
}

function Get-Title
{
    [CmdletBinding()]
    param(
        [Parameter(Position=0, Mandatory=$true)]
        $TitleString,

        [Parameter(Position=1)]
        $Separator = ' '
    )

    Get-Value -ValueString $TitleString -Separator $Separator  
}

function Get-Value
{
    [CmdletBinding()]
    param(
        [Parameter(Position=0, Mandatory=$true)]
        $ValueString,

        [Parameter(Position=1)]
        $Separator = ' '
    )

    $Options = [System.StringSplitOptions]::RemoveEmptyEntries
    $ValueString.Split($Separator, $Options)
}