Crear funciones en est script

Iniciado por Meta, 28 Noviembre 2017, 09:57 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:

Estoy usando desde ISE con PowerShell este código. Lo que hace ahora es crear un formulario Windows Form en el cual abre y cierra la bandeja del lector del disco.

$MemDef = @"
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
   public static extern int mciSendStringA(
   string lpstrCommand,
   string lpstrReturnString,
   int uReturnLength,
   IntPtr hwndCallback);
"@

$winnm = Add-Type -memberDefinition $MemDef -ErrorAction 'SilentlyContinue' -passthru -name mciSendString
function Set-CDAudioDoor {
Param(
  [ValidateSet("open", "closed")][String[]]$Mode = 'open'
)
$winnm::mciSendStringA("set cdaudio door $mode", $null, 0,0)}

[void][reflection.assembly]::loadwithpartialname("System.Windows.Forms")
[void][reflection.assembly]::loadwithpartialname("System.Drawing")


$Form = New-Object system.Windows.Forms.Form
$Form.Text = "PowerShell 2017"
$Form.TopMost = $true
$Form.Width = 300
$Form.Height = 300
$Form.StartPosition = "CenterScreen"



$button_Abrir = New-Object system.windows.Forms.Button
$button_Abrir.Text = "Abrir"
$button_Abrir.Width = 75
$button_Abrir.Height = 23
$button_Abrir.location = new-object system.drawing.point(40, 150)
$button_Abrir.Font = "Microsoft Sans Serif,10"
$Form.controls.Add($button_Abrir)


$button_Cerrar = New-Object system.windows.Forms.Button
$button_Cerrar.Text = "Cerrar"
$button_Cerrar.Width = 75
$button_Cerrar.Height = 23
$button_Cerrar.location = new-object system.drawing.point(174, 150)
$button_Cerrar.Font = "Microsoft Sans Serif,10"
$Form.controls.Add($button_Cerrar)




$label_Mensaje = New-Object system.windows.Forms.Label
$label_Mensaje.Text = "?"
$label_Mensaje.AutoSize = $true
$label_Mensaje.Width = 25
$label_Mensaje.Height = 10
$label_Mensaje.location = new-object system.drawing.point(54,26)
$label_Mensaje.Font = "Microsoft Sans Serif,36,style=Bold"
$Form.controls.Add($label_Mensaje)

# Abrir  bandeja.
$label_Mensaje.Text = "Abriendo..."
$button_Abrir.Add_Click({Set-CDAudioDoor open})
$label_Mensaje.Text = "Abierto."

# Cerrar bandeja.
$label_Mensaje.Text = "Cerrando..."
$button_Cerrar.Add_Click({Set-CDAudioDoor closed})
$label_Mensaje.Text = "Cerrado."

[void]$Form.ShowDialog()
$Form.Dispose() 


Al ejecutar este Script, muestra esta imagen.


Com podrás observar, siempre se ejecuta una detrás otra esta instrucción de mensajes.
$label_Mensaje.Text = "Cerrado."

Mi idea es, que al pulsar el botón Abrir, aparezca el mensaje "Abrriendo...", se abre la bandeja del todo, sale otro mensaje, "Abierto.", lo mismo al pulsar el botón Cerrar.

¿En que fallo?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Serapis

#1
Creo recordar que Elektro ya te respondió a esta cuestió en otro HILO...
Y se resume en: No HAY subscripción a EVENTOS DEL SISTEMA.

Lo que haces, es lo mismo que si tienes estas 3 órdenas:

Digo: "abriendo la puerta del coche"
Ordeno a Juan: "Abre la puerta del coche"
Digo: "Puerta abierta"

Falla (la secuencia correctamente ordenada de sucesos), porque nada más das la orden de abrir, ya indicas 'abierto' sin esperar el tiempo prudencial a que lo abra.

La secuencia correcta sería...

Digo: "abriendo la puerta del coche"
Continuar = FALSE
Ordeno a Juan: "abre la puerta del coche y AVÍSAME cuando termines (con lo que sea que haya pasado)."
                                                            //<--- ojo: AQUÍ la subscripción al evento.
Espero: hasta que continuar = TRUE  // esto sólo si la orden es asíncrona como resulta ser...
...

// ante el evento cuando le llegue el mensaje...
AvisoDeJuan(aviso)
   Digo: aviso
   // sea cual sea el aviso: "Puerta abierta", "Puerta atascada", "Ya estaba abierta", "puerta cerrada",
   // "No tiene puerta", "Yo no soy Juan", "No lo veo, te han robado el coche"
   //        (vamos el equivalente a la unidad ya no está conectada, ¿fue extraída?), bla, bla, bla...
   Continuar = TRUE
fin avisoDeJuan


Una alternativa mediocre (pero que la mayor parte de las veces podría servir), sería no subscribirse a evento alguno, pero al menos dar un margen de tiempo para que abra, tal vez 2 segundos...

Digo: "abriendo la puerta del coche"
Ordeno a Juan: "Abre la puerta del coche"
Espero: 2 segundos
Digo: "Puerta abierta"




p.d.: contínuamente estás preguntando una  y otra vez lo mismo, y la respuesta es siempre la misma... entiende la sincronicidad en la programación. Cuando se da y cuando no se dá y porqué.... si no seguirás dando palos de ciego, aquí y allá.

Meta

Lo tendré en cuenta, voy a investigar lo que dices. Gracias. ;)
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/