private/Start-MBSProcess.ps1

function Start-MBSProcess {
    <#
    .SYNOPSIS
        Start exe with arguments and get result
    .DESCRIPTION
        Start exe with arguments and get result
    .EXAMPLE
        PS C:\> Start-MBSProcess -CMDPath (Get-MBSAgent).CBBClipath -CMDArguments "nwclist -s" -Output json -MasterPassword (ConvertTo-SecureString -string "1234" -AsPlainText -Force)
         
        Errors Warnings Result
        ------ -------- ------
        {Master password is invalid.} {} Fail
 
    .EXAMPLE
        PS C:\> (Start-MBSProcess -CMDPath (Get-MBSAgent).cbbClipath -CMDArguments "nwclist -s" -Output json -MasterPassword (ConvertTo-SecureString -string "123" -AsPlainText -Force)).Share
 
 
        Available Login Share
        --------- ----- -----
        Not tested dev\alex.v \\hermes\10tb_share
 
    .INPUTS
        None
    .OUTPUTS
        PSCustomObject
    .NOTES
        Author: Alex Volkov
        Editor: Andrew Anushin
    #>


    [CmdletBinding()]
    param (
        [Parameter()]
        [string]
        $CMDPath,
        [Parameter()]
        [string]
        $CMDArguments,
        [Parameter()]
        [securestring]
        $MasterPassword,
        [Parameter()]
        [ValidateSet("json","short","full","none")]
        [string]
        $Output
    )
    
    begin {
        
    }
    
    process {
        $ProcessStartInfo = New-Object System.Diagnostics.ProcessStartInfo
        $ProcessStartInfo.FileName = $CMDPath
        $ProcessStartInfo.RedirectStandardError = $true
        $ProcessStartInfo.RedirectStandardOutput = $true
        $ProcessStartInfo.UseShellExecute = $false
        
        if ($MasterPassword) {
            $CMDArguments += " -mp """+([System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($MasterPassword)))+""""
        }

        if (($Output -eq "short") -And ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent)) {$Output = "full"}

        switch ($Output) {
            json {$CMDArguments += " -json"}
            short {$CMDArguments += " -output short"}
            full {$CMDArguments += " -output full"}
            Default {}
        }

        Write-Verbose -Message "$($PSCmdlet.MyInvocation.MyCommand.Name): Arguments: $(((((($CMDArguments -replace '-mp "\w*"','-mp "****"') -replace '-p "\w*"','-p "****"') -replace '-cp "\w*"','-cp "****"') -replace '-c "\w*"','-c "****"') -replace '-password "\w*"','-password "****"') -replace '-ep "\w*"','-ep "****"')"
        $ProcessStartInfo.Arguments = $CMDArguments
        $Process = New-Object System.Diagnostics.Process
        $Process.StartInfo = $ProcessStartInfo
        $Process.Start() | Out-Null
        $Process.WaitForExit()

        if ($Output -eq "json") {
            $result = $Process.StandardOutput.ReadToEnd().replace("Content-Type: application/json; charset=UTF-8","") |ConvertFrom-Json
            if($null -ne $result){
                if ($result.Result -ne "Success") {
                    if ('' -ne $result.Warnings) {
                        $result.Warnings | ForEach-Object -Process {
                            Write-Warning -Message $_
                        }
                    } 
                    if ('' -ne $result.Errors) {
                        $result.Errors | ForEach-Object -Process {
                            Write-Error -Message $_
                        }
                    }
                } 
            }
        } elseif (($Output -eq "short") -or ($Output -eq "full")) {
            $result = New-Object -TypeName MBS.Agent.CLIResult
            $Process.StandardOutput.ReadToEnd().split([Environment]::NewLine) | ForEach-Object -Process {
                if ($_ -match 'WARNING: \w*') {
                    Write-Warning -Message $_.replace("WARNING: ","")
                    $result.Warnings += $_.replace("WARNING: ","")
                } elseif ($_ -match 'ERROR: \w*') {
                    Write-Error -Message $_.replace("ERROR: ","")
                    $result.Errors += $_.replace("ERROR: ","")
                } elseif ($_) {
                    if ($_ -notmatch ".*Command Line Interface started.*") {
                        $result.Result += $_
                    }
                }
            }
        } else {
            [MBS.Agent.CLIRawResult]$result = @{
                stdout = $Process.StandardOutput.ReadToEnd()
                stderr = $Process.StandardError.ReadToEnd()
                ExitCode = $Process.ExitCode
            }
        }
    }
    
    end {
        return $result
    }
}