Private/Test-TechCareConsent.ps1

function Test-TechCareConsent {
    <#
    .SYNOPSIS
        Pide confirmacion al tecnico y falla cerrado si nadie puede responder.
    .DESCRIPTION
        $PSCmdlet.ShouldContinue no sirve tal cual en una ejecucion desatendida.
        Medido en PowerShell 7.6 sobre Linux:

          - con -NonInteractive lanza MethodInvocationException
            ("PowerShell is in NonInteractive mode").
          - con la entrada redirigida imprime el menu de respuesta y despues
            lanza NullReferenceException.

        En ambos casos la excepcion escapa del orquestador y la pasada muere con
        un error que no explica nada, en vez de con el mensaje de que hace falta
        -Force. Y [Environment]::UserInteractive devuelve True en los dos, asi que
        no sirve para detectarlo: el indicador util es Console::IsInputRedirected.

        Esta envoltura devuelve falso en cuanto no hay nadie para contestar, que
        es el lado seguro: la pasada se cancela en vez de aplicar cambios sin
        consentimiento.
    #>

    [CmdletBinding()]
    [OutputType([bool])]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$Question,

        [Parameter(Mandatory)]
        [System.Management.Automation.PSCmdlet]$Caller
    )

    try {
        if ([System.Console]::IsInputRedirected) {
            Write-TechCareLog -Level Warning -Message 'Sesion sin entrada interactiva: se cancela. Usa -Force para ejecutar desatendido.'
            return $false
        }
    } catch {
        # Un host sin consola real (ISE, un runspace embebido) tampoco puede
        # preguntar; se trata igual que la entrada redirigida.
        Write-TechCareLog -Level Warning -Message 'Host sin consola: se cancela. Usa -Force para ejecutar desatendido.' -ErrorText $_.Exception.Message
        return $false
    }

    try {
        return [bool]$Caller.ShouldContinue($Question, 'TechCare')
    } catch {
        Write-TechCareLog -Level Warning -Message 'No se pudo pedir confirmacion: se cancela. Usa -Force para ejecutar desatendido.' -ErrorText $_.Exception.Message
        return $false
    }
}