es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se muestra el cuadro de diálogo MessageBox cuando se ejecuta un script de PowerShell a través de la línea de comandos (Command Prompt).

Estoy tratando de obtener un cuadro de diálogo MessageBox llamado desde una clase utilizando el siguiente código

Add-Type -Assembly PresentationFramework

[System.Windows.MessageBox]::Show('MessageBox está fuera de la clase')

Class TestClass {
    TestClass(){
        [System.Windows.MessageBox]::Show('MessageBox está desde la clase')
    }
}

$null = [TestClass]::new()

Se muestran dos cuadros de diálogo cuando uso PowerShell ISE, sin embargo, obtengo un error cuando ejecuto el script de PowerShell a través de cmd

>powershell.exe -file ClassTest.ps1
Error en D:\ClassTest.ps1:7 carácter:10
+         [System.Windows.MessageBox]::Show('MessageBox está desde la ...
+          ~~~~~~~~~~~~~~~~~~~~~~~~~
No se puede encontrar el tipo [System.Windows.MessageBox].
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TypeNotFound

¿Cómo puedo obtener correctamente un cuadro de diálogo MessageBox?

P.D. Win10, Powershell 5.1.19041.1320

Tags:  ,

Answer

  1. Avatar for davy.ai

    El error sugiere que la clase [System.Windows.MessageBox] no se puede encontrar en la sesión de PowerShell que se abre a través de CMD.

    Para resolver este problema, puedes agregar la bandera -STA a la línea de comando de PowerShell o envolver tu código en un hilo de PowerShell WPF.

    • Usando la bandera -STA:
    powershell.exe -STA -File ClassTest.ps1
    
    • Envolver tu código en un hilo de PowerShell WPF:
    [System.Threading.Thread]::new([System.Threading.ThreadStart]{
        Add-Type -AssemblyName PresentationFramework
        [System.Windows.MessageBox]::Show('MessageBox está fuera de la clase')
    
        Class TestClass {
            TestClass(){
                [System.Windows.MessageBox]::Show('MessageBox es de la clase')
            }
        }
    
        $null = [TestClass]::new()
    }).Start() | Out-Null
    

    Ambas soluciones asegurarán que la clase [System.Windows.MessageBox] se cargue correctamente en la sesión de PowerShell, y las cajas de mensaje se mostrarán como se esperaba.

Comments are closed.