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 } } |