src/PSObjectToString.ps1

$script:tabnum = 0
function PSObjectToString($obj, [Switch]$OneLine = $false) {
    if ($obj -is [System.Collections.IDictionary]) {
        $script:tabnum += 1
        $str = ''
        if ($obj -is [System.Collections.Specialized.OrderedDictionary]) {
            $str = '[ordered]'
        }
        $str += '@{'
        if (-not $OneLine) {
            $str += "`n"
        }
        $str += (($obj.GetEnumerator() | ForEach-Object {
            if (-not $OneLine) {
                "`t" * $script:tabnum
            }
            $_.Key + ' = ' + $(PSObjectToString $_.Value $OneLine)
            if (-not $OneLine) { "`n" }
            else { ';' }
        }) -join '')
        if (-not $OneLine) {
            $str += "`t" * ($script:tabnum - 1)
        }
        $str += '}'
        $str
        $script:tabnum -= 1
    }
    elseif ($obj -is [System.Collections.ICollection]) {
        '@(' + (($obj | ForEach-Object {
            PSObjectToString $_ $OneLine
            ', '
        } | Select-Object -SkipLast 1) -join '') + ')'
    }
    elseif ($obj -is [string]) {
        "'" + $obj.Replace("'", "''") + "'"
    }
    elseif ($obj -is [int]) { $obj }
    elseif ($obj -is [bool] -or $obj -is [switch]) { "`$$obj" }
    else { "$obj" }
}
function Get-ArgsString([hashtable]$Params) {
    $Params.GetEnumerator() | ForEach-Object { "-$($_.Key):$(PSObjectToString $_.Value -OneLine)" }
}