I’m sure there’s a cleaner way to capture the output from Write-Host, Write-Verbose, etc.  However, I’m just going to “go caveman” in the words of a coworker and just hack around with the Verb-Transcript cmdlets.

Without further ado:

function Get-MisbehavingCmdletOutput
{
    param (
        [System.Management.Automation.Scriptblock]$ScriptBlock = $null,
        [string]$Path = "$env:temp\$([System.IO.Path]::GetRandomFileName())"
    );

    if (!$ScriptBlock)
    {
        write-host "$($MyInvocation.MyCommand.Name) -ScriptBlock not specified, required.  Stopped.";
        return;
    }

    New-Item -ItemType Directory -Path $Path -ErrorAction SilentlyContinue -OutVariable $null | Out-Null;
    Remove-Item -Path $Path

    Start-Transcript -Path $Path -ErrorAction Stop | Out-Null;
    & $ScriptBlock;
    Stop-Transcript -OutVariable $null | Out-Null;

    $data = Get-Content -Path $Path;

    $end = $data.count - 6;
    $data[6..($data.count - 5)];

}