2008-10-19 12 views
6

Cuando ejecuto el siguiente, PowerShell cuelga esperando el diálogo para cerrar, a pesar de que el diálogo nunca se muestra:llamada OpenFileDialog de PowerShell

[void] [Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 
$d = New-Object Windows.Forms.OpenFileDialog 
$d.ShowDialog() 

Calling ShowDialog en un Windows.Forms.Form funciona bien. También intenté crear un Form y pasarlo como padre al $d.ShowDialog, pero el resultado no fue diferente.

+0

Si alguien está interesado, esto es lo que lo estaba usando para: http://stackoverflow.com/questions/182573/powershell-cli-or-gui-which-do-you- need-or-prefer # 216936 –

Respuesta

17

Pude duplicar el problema y encontré una solución. No sé por qué sucede esto, pero le ha sucedido a otros.

Si establece la propiedad ShowHelp en $ true, obtendrá el diálogo para que aparezca correctamente.

Ejemplo:

[void] [Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 
$d = New-Object Windows.Forms.OpenFileDialog 
$d.ShowHelp = $true 
$d.ShowDialog() 

buena suerte!

+0

¡Solución interesante! Sería interesante saber cómo configurar ShowHelp "corrige" el problema, pero me alegro de que funcione :) –

+0

Extraño, la solución alternativa no funciona para mí. Con o sin él, el diálogo se abre detrás de la ventana de powershell. – Charlie

+0

Parece que la diferencia podría deberse a la versión de Powershell o a la versión del sistema operativo (véanse los comentarios de Steven sobre mi respuesta) – Charlie

2

Me parece que el cuadro de diálogo se está abriendo realmente bien, pero está detrás de la ventana de la consola de powershell. Lamentablemente, no se muestra en la barra de tareas, por lo que no hay ninguna indicación de que esté allí a menos que mueva la ventana de PowerShell o Alt + Tab. También parece que la solución de ShowHelp no tuvo ningún efecto para mí.

EDIT Aquí hay una manera de hacerlo con su idea de forma secundaria. La idea básica es crear un nuevo formulario que abra OpenFileDialog desde dentro de su evento Mostrado. La tecla está llamando a Activar en el formulario antes de abrir el cuadro de diálogo, de modo que el formulario llegue al frente y aparezca el cuadro de diálogo. Moví el formulario fuera de pantalla configurando la Ubicación en un valor fuera de pantalla, pero alternativamente, puede establecer Form.Visible = $ false desde el evento Mostrado.

[void] [Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 

$ofn = New-Object System.Windows.Forms.OpenFileDialog 

$outer = New-Object System.Windows.Forms.Form 
$outer.StartPosition = [Windows.Forms.FormStartPosition] "Manual" 
$outer.Location = New-Object System.Drawing.Point -100, -100 
$outer.Size = New-Object System.Drawing.Size 10, 10 
$outer.add_Shown({ 
    $outer.Activate(); 
    $ofn.ShowDialog($outer); 
    $outer.Close(); 
}) 
$outer.ShowDialog() 
+1

Comprobé dos veces y el cuadro de diálogo no aparece en absoluto, incluso después de mover o minimizar la ventana de Powershell. Debe ser algo diferente en tu configuración? –

+0

Intenté su código editado; apareció el formulario pero el diálogo de archivo solo funcionó después de volver a hacerlo con $ ofn.ShowHelp establecido en verdadero. –

+0

Me pregunto si el sistema operativo podría tener algo que ver con eso. Estoy usando XP Pro: ¿y ustedes dos? – Charlie

1

Aparentemente esto tiene algo que ver con el modo Multi-Threaded Apartment (MTA). Parece que funciona bien en el modo de apartamento con un solo subproceso (-STA).

Consulte también: Could you explain STA and MTA?

Cuestiones relacionadas