Articles

SAPIEN Technologies (Español)

después de muchos años de escribir scripts para la consola de Windows PowerShell, ahora Estoy aprendiendo el siguiente nivel de automatización: escribir aplicaciones GUI que ejecutan comandos de Windows PowerShell. PowerShell Studio forms Proporciona una introducción suave y bien guiada a las aplicaciones GUI, pero todavía me ha llevado algún tiempo romper viejos hábitos.

constantemente necesito recordarme que las cosas que «simplemente funcionan» en la consola no tienen ningún sentido en una GUI. La salida de escritura es una de ellas.,

escritura de resultados en la consola

cuando se generan resultados en la consola de Windows PowerShell, los resultados aparecen como cadenas de texto en la ventana de la consola.

PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM

entre bastidores, Windows PowerShell agrega silenciosamente un comando Out-String a la canalización y envía los resultados a «salida estándar» («stdout»). El proceso que aloja Windows PowerShell maneja la salida estándar, casi siempre escribiendo la salida en la consola (el comportamiento del host puede variar).,

por lo tanto, si ejecuta un cmdlet que devuelve objetos, como el cmdlet Get-Process, (las representaciones de cadena de) los objetos aparecen en la consola.

si formatea objetos, por ejemplo, usando Format-List o Format-Table, las representaciones de cadena de los objetos formateados aparecen en la consola.

si ejecuta Write-Host o Write-Output, Out-Host o Out-String, las cadenas de salida aparecen en la consola.

e incluso si envía la salida a un flujo de salida alternativo mediante Write-Warning, Write-Verbose o Write-Error, de forma predeterminada, la salida aparece en la consola.,

pero la aplicación GUI no tiene consola. ¿Qué sucede con la salida que de otro modo iría a la consola cuando no hay consola? Y, lo que es más importante, ¿Cómo administro la salida sin una consola?

¿Dónde está mi salida?

las aplicaciones GUI, como las geniales que se escriben en PowerShell Studio, no tienen consola. No hay salida estándar. No hay una cadena de salida auto-anexada.

por lo tanto, cuando genera la salida y no la guarda en un archivo o una variable, la salida se pierde.,

Get-Process | ... <Nowhere> ...

ES como un lanzador lanzando una pelota de béisbol cuando no hay un receptor en el campo. La pelota simplemente cae al suelo y rueda para detenerse .. ignorar.

por lo tanto, en una aplicación GUI, no puede escribir la salida y esperar lo mejor. Si desea mostrar el resultado del cmdlet o guardarlo, debe hacerlo explícitamente.

mostrar la salida en un cuadro de texto

una aplicación GUI es una colección de controles. Para mostrar la salida, debe asignar la salida a un control, como un cuadro de texto, un cuadro de texto enriquecido o una cuadrícula de datos.,

por ejemplo, para mostrar el nombre del equipo local en la consola, ejecute un comando env env:ComputerName.

PS C:> $env:ComputerNameJUNEB-TESTBOX

Cuando intento lo mismo en una aplicación GUI donde no hay consola, no veo ningún resultado en absoluto. En este ejemplo, creé un formulario con un botón que, al hacer clic, ejecuta la expresión env env:ComputerName.,

$buttonComputerName_Click = { <b>$env:ComputerName</b>}

Pero, cuando hago clic en el botón, no pasa nada, incluso si tengo una consola abierta la ventana.

para mostrar el nombre del equipo en una aplicación GUI, agrego un control de visualización a mi formulario y asigno la salida del comando a un método del control de visualización.,

por ejemplo, puedo agregar un control Textbox al formulario y usar el operador de asignación ( = ) para asignar el resultado de la expresión a la propiedad Text del TextBox. Ahora, cuando haces clic en el botón, ves la salida en el cuadro de texto.

$buttonComputerName_Click = { $textboxResults.Text =env env: ComputerName}

Este es el resultado:

mostrar la salida en un programa diferente

También puede mostrar la salida de comandos en objetos que no forman parte de su programa., Los profesionales de GUI piensan que este enfoque es descuidado y no es una buena práctica, pero puede ser útil para probar o depurar.

por ejemplo, puede canalizar la salida al cmdlet Out-GridView.

$buttonComputerName_Click = { $env:ComputerName | Out-GridView}

Aquí está el resultado:

también puede escribir a un archivo y abra el archivo. Estos comandos de ejemplo crean un archivo temporal, escriben en el archivo y luego usan el Bloc de notas para mostrar el archivo., Una vez más, Esto hace que los programadores reales se estremezcan, pero funciona, al menos para las pruebas.

Este es el resultado:

convertir a cadenas

otra tarea que debe administrar en una aplicación GUI es convertir objetos a cadenas de texto. Por lo general, esto solo significa canalizar la salida a un cmdlet Out, como Out-String. Los cmdlets Out, incluido Out-GridView, convierten objetos en datos de cadena.

Cuando se escriben resultados en la consola, Windows PowerShell añade automáticamente un comando Out-String a la canalización., Pero, no hay consola ni cadena de salida automática en una aplicación GUI.

cuando se asignan objetos que no son de cadena a un objeto de cadena o a un control que toma objetos de cadena, como un cuadro de texto, Windows PowerShell llama al método toString() del objeto. (En otros idiomas, la tarea simplemente fallaría, pero está tratando de ayudar.) Con algunos objetos, como DateTime y ErrorRecord, toString () funciona bien, pero, en muchos casos, produce resultados extraños.

por ejemplo, este comando asigna los resultados de un comando Get-Process a un cuadro de texto., Windows PowerShell reconoce que necesita texto y llama al método toString () de los objetos de proceso, pero el resultado no es útil.

$buttonGetProcess_Click = { $textboxResults.Text = Get-Process}

para obtener una representación de cadena de la tabla de procesos predeterminada, canalice la salida al cmdlet Out-String y, a continuación, asígnela al cuadro de texto.

$buttonGetProcess_Click = { $textboxResults.,Text = Get-Process/Out-String}

consejo: para que la salida sea fácil de leer, configure el cuadro de texto (o cuadro de texto enriquecido) para que use una fuente monoespacial. En PowerShell Studio, haga clic con el botón secundario en el cuadro de texto, haga clic en Aplicar conjunto de propiedades y, a continuación, haga clic en Aplicar fuente de consola.

no evites toString() completamente. Hay algunos objetos donde el método toString () produce un resultado útil. Los objetos DateTime son el ejemplo clásico. El método toString () de un objeto DateTime devuelve una cadena de formato «short-date/long-time». Out-String devuelve un formato «long-date / long-time».,

PS C:> (Get-Date).ToString()12/6/2014 10:42:24 AMPS C:> Get-Date | Out-StringSaturday, December 6, 2014 10:42:37 AM

#Utiliza el método toString () de$buttonGetDate_Click = { $textboxDate.Text=Get-Date}

#usa toString () butt buttonGetDate_Click = {text textboxDate.Text = Get-Date / Out-String}

También puede utilizar los parámetros Format y Uformat del cmdlet Get-Date para obtener una cadena de fecha formateada en casi cualquier configuración., Por ejemplo, para obtener una fecha en formato RFC1123, use-Format R (O «r»). No es necesario canalizar a Out-String cuando se utiliza Format o UFormat, porque estos parámetros obligan al cmdlet a devolver una cadena.

PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT

convertir objetos formateados

en la consola, los cmdlets de formato, como Format-Table, suelen ser el último elemento de una canalización. La salida se ve muy bien en la consola, porque Windows PowerShell añade un comando Out-String a la canalización antes de enviarlo a la consola.,

pero, en una aplicación GUI, de forma predeterminada, se obtiene el resultado de llamar al método toString() de los objetos de formato que devuelven los cmdlets de formato.

$buttonGetHotfix_Click = { $textboxHotFix.Text=Get-HotFix | Format-Table-Property HotFixID, InstalledOn-AutoSize}

para obtener una visualización más útil en la aplicación GUI, canalice los objetos format al cmdlet Out-String antes de asignarlos a la propiedad Text del cuadro de texto.,

¡mejor!

después de un tiempo, la tarea de administrar la visualización de resultados en las aplicaciones GUI se vuelve tan natural como escribir un nombre de cmdlet, pero mientras aprende, asegúrese de probar y asegurarse de que toda la salida se capture y se muestre en un formato utilizable.

June Blender es evangelista de tecnología en SAPIEN Technologies, Inc. Se puede llegar a ella en [email protected] o seguirla en Twitter en @juneb_get_help.