Private/Invoke-TechCareProcess.ps1

function Invoke-TechCareProcess {
    <#
    .SYNOPSIS
        Ejecuta un binario externo y devuelve su codigo de salida y su salida.
    .DESCRIPTION
        DISM, sfc, chkdsk, powercfg y winget comunican el resultado por codigo de
        salida y por texto, y cada uno de forma distinta. Esta envoltura unifica
        ambos en un objeto para que los modulos no repitan el manejo de errores.

        No impone limite de tiempo: DISM y sfc pueden tardar media hora en una
        imagen muy danada y cortarlos a medias deja el almacen de componentes en
        peor estado que no haber empezado.
    #>

    [CmdletBinding()]
    [OutputType([pscustomobject])]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$FilePath,

        [AllowEmptyCollection()]
        [string[]]$ArgumentList = @()
    )

    $result = [pscustomobject]@{ ExitCode = 0; Output = '' }
    try {
        $global:LASTEXITCODE = 0
        $output = & $FilePath @ArgumentList 2>&1 | Out-String
        $result.ExitCode = $LASTEXITCODE
        $result.Output   = $output.Trim()
    } catch {
        # -1 no lo devuelve ningun binario de Windows, asi que distingue "no se
        # pudo lanzar" de cualquier codigo real del proceso.
        $result.ExitCode = -1
        $result.Output   = $_.Exception.Message
    }
    return $result
}