Cómo crear una GUI para scripts de PowerShell – TrucosInformaticos

Powershell

La interfaz de línea de comandos es uno de los principales inconvenientes de los scripts de PowerShell cuando los utilizan los usuarios (no los administradores de sistemas ni los programadores). Los resultados del script se muestran en la consola CLI de PowerShell, lo que no siempre es conveniente para los usuarios finales. Para que sus scripts sean más fáciles de usar, puede agregarles fácilmente una interfaz gráfica de usuario (GUI) simple.

Puede crear elementos gráficos para sus scripts de PowerShell mediante el uso de objetos de .NET Framework en Windows PowerShell. Las bibliotecas de uso común son .NET Windows Forms (WinForms) o Windows Presentation Foundation (WPF).

Cree una GUI de PowerShell usando la clase WinForms

En este ejemplo, usamos la clase System.Windows.Forms para crear una GUI simple para un script de PowerShell. El script muestra la última fecha de cambio de contraseña para el usuario de Active Directory seleccionado.

Pista. Puede editar sus scripts de PowerShell con el PowerShell ISE integrado o instalar el código de Visual Studio avanzado (VScode).

Abra su editor de código de PowerShell y cree un nuevo archivo .ps1.

Crear formulario de Windows con PowerShell

Debe cargar la clase .NET System.Windows.Forms en su sesión de PowerShell para usar objetos de WinForms.

Add-Type -assembly System.Windows.Forms

Luego cree el formulario de pantalla (ventana) que contendrá los elementos gráficos:

$main_form = New-Object System.Windows.Forms.Form

Establezca el título y el tamaño (ancho y alto) del formulario:

$main_form.Text="GUI for my PoSh script"

$main_form.Width = 600

$main_form.Height = 400

Utilice la propiedad AutoSize para estirar automáticamente el formulario si los elementos del formulario están fuera de los límites del formulario:

$main_form.AutoSize = $true

Ahora puede mostrar el formulario en la pantalla:

$main_form.ShowDialog()

¿Cómo agregar elementos de control de diálogo comunes a un formulario de PowerShell?

Como puede ver, se muestra un formulario gráfico en blanco. Para agregarle elementos gráficos de diálogo y control, agregue el siguiente código antes de la última línea ($main_form.ShowDialog()).

Cree un elemento de etiqueta en el formulario (muestra texto personalizado):

$Label = New-Object System.Windows.Forms.Label

$Label.Text = "AD users"

$Label.Location  = New-Object System.Drawing.Point(0,10)

$Label.AutoSize = $true

$main_form.Controls.Add($Label)

Las coordenadas relativas de la forma gráfica donde se va a visualizar el elemento se especifican mediante el Ubicación propiedad. Los objetos System.Drawing.Point se utilizan para establecer el tamaño y la posición de los controles. Se pasan dos coordenadas como argumentos: la primera es horizontal y la segunda es una coordenada vertical. El origen de las coordenadas está en la esquina superior izquierda.

Vamos a crear una lista desplegable que contenga una lista de cuentas de usuario del dominio de Active Directory. Puede usar el cmdlet Get-ADuser para obtener la lista de usuarios de AD (del módulo Active Directory de PowerShell):

$ComboBox = New-Object System.Windows.Forms.ComboBox

$ComboBox.Width = 300

$Users = get-aduser -filter * -Properties SamAccountName

Foreach ($User in $Users)

{

$ComboBox.Items.Add($User.SamAccountName);

}

$ComboBox.Location  = New-Object System.Drawing.Point(60,10)

$main_form.Controls.Add($ComboBox)

Agregue dos etiquetas más al formulario. El primero debe mostrar una etiqueta estática y el segundo debe mostrar la última vez que se cambió la contraseña de la cuenta de usuario de AD seleccionada:

$Label2 = New-Object System.Windows.Forms.Label

$Label2.Text = "Last Password Set:"

$Label2.Location  = New-Object System.Drawing.Point(0,40)

$Label2.AutoSize = $true

$main_form.Controls.Add($Label2)

$Label3 = New-Object System.Windows.Forms.Label

$Label3.Text = ""

$Label3.Location  = New-Object System.Drawing.Point(110,40)

$Label3.AutoSize = $true

$main_form.Controls.Add($Label3)

Ahora coloque el botón en el formulario:

$Button = New-Object System.Windows.Forms.Button

$Button.Location = New-Object System.Drawing.Size(400,10)

$Button.Size = New-Object System.Drawing.Size(120,23)

$Button.Text = "Check"

$main_form.Controls.Add($Button)

Ahora asigne una acción al botón. Después de hacer clic en el botón, la secuencia de comandos debe recuperar el valor del atributo pwdLastSet de Active Directory para el usuario seleccionado en $ComboBox:

$Button.Add_Click(

{

$Label3.Text =  [datetime]::FromFileTime((Get-ADUser -identity $ComboBox.selectedItem -Properties pwdLastSet).pwdLastSet).ToString('MM dd yy : hh ss')

}

)

Utilizar el Visible propiedad para ocultar algunos de los elementos de la GUI en un formulario de Windows.

$Label3.Text.Visible = $false

# or $True if you want to show it

Ejecute el script de PowerShell. Como puede ver, la lista desplegable se completa automáticamente con los nombres de las cuentas de usuario de Active Directory. Cuando seleccione la cuenta de usuario y haga clic en el Controlar el formulario muestra la hora en que se cambió por última vez la contraseña del usuario en Active Directory.

generador de interfaces gráficas de usuario de PowerShell

Entonces, ha creado su primera interfaz gráfica de usuario simple para un script de PowerShell. ¿Que sigue? Ahora está listo para agregar elementos de interfaz de usuario más complejos a su formulario de PowerShell.

Elementos de interfaz de usuario de PowerShell de uso común

Del mismo modo, puede crear el siguiente gráfico gráfico en el formulario:

  • Casilla de verificación: se usa para enumerar y seleccionar algunas opciones;
  • RadioButton: enumera algunos elementos y le permite seleccionar solo uno;
  • TextBox: elemento de diálogo de texto para la entrada del usuario;
  • Etiqueta: se utiliza para mostrar texto en un formulario de pantalla;
  • ChekedListBox: muestra una lista de elementos con casillas de verificación (permite seleccionar varios elementos);
  • DataGridView — permite mostrar algunos datos tabulares;
  • GroupBox: permite ver y agrupar un conjunto de controles;
  • ListBox: contiene varios elementos de texto y le permite seleccionar uno o más elementos;
  • TabControl: le permite dividir su formulario en diferentes áreas (pestañas);
  • ListView: muestra una lista de elementos con texto y (opcionalmente) un icono;
  • TreeView — vista de objetos jerárquicos;
  • DateTimePicker: permite seleccionar el valor de fecha y hora;
  • TrackBar: control desplazable;
  • PictureBox — permite mostrar una imagen en el formulario;
  • ProgressBar — indica el progreso de la operación;
  • HScrollBar — barra de desplazamiento horizontal;
  • VScrollBar — barra de desplazamiento vertical;
  • ContextMenu: menús contextuales;
  • Menú — menú superior en su formulario.

Creación de menús gráficos interactivos para PowerShell Script

Use la clase WinForms para agregar menús jerárquicos complejos a sus scripts gráficos de PowerShell. En este ejemplo, agregaremos algunos elementos de menú a un formulario de PowerShell creado previamente con una estructura simple:

  • Archivo
  • Abierto
  • Ahorrar
  • Salida
  • Ayuda
  • Acerca de

Para crear un menú horizontal en un formulario de Windows, debe crear un MenuStrip objeto. Usar ToolStripMenuItem objetos para elementos de menú. ToolStripButton Los objetos se utilizan para vincular acciones (funciones de PowerShell) a elementos de menú.

Cree algunos objetos WinForms nuevos para su menú:

$menuMain         = New-Object System.Windows.Forms.MenuStrip

$mainToolStrip    = New-Object System.Windows.Forms.ToolStrip

$menuFile         = New-Object System.Windows.Forms.ToolStripMenuItem

$menuOpen         = New-Object System.Windows.Forms.ToolStripMenuItem

$menuSave         = New-Object System.Windows.Forms.ToolStripMenuItem

$menuExit = New-Object System.Windows.Forms.ToolStripMenuItem

$menuHelp         = New-Object System.Windows.Forms.ToolStripMenuItem

$menuAbout        = New-Object System.Windows.Forms.ToolStripMenuItem

$toolStripOpen    = New-Object System.Windows.Forms.ToolStripButton

$toolStripSave    = New-Object System.Windows.Forms.ToolStripButton

$toolStripExit = New-Object System.Windows.Forms.ToolStripButton

$toolStripAbout = New-Object System.Windows.Forms.ToolStripButton

Ahora necesita vincular su menú al formulario GUI ($main_form):

$main_form.MainMenuStrip = $menuMain

$main_form.Controls.Add($menuMain)

[void]$mainForm.Controls.Add($mainToolStrip)

Ahora puede mostrar el primer menú:

# Show Menu Bar

[void]$main_Form.Controls.Add($menuMain)

# Menu: File

$menuFile.Text = "File"

[void]$menuMain.Items.Add($menuFile)

Luego agregue elementos desplegables al menú Archivo:

# Menu: File -> Open

$menuOpen.Text         = "Open"

$menuOpen.Add_Click({OpenFile})

[void]$menuFile.DropDownItems.Add($menuOpen)

# Menu: File -> Save

$menuSave.Text         = "Save"

$menuSave.Add_Click({SaveFile})

[void]$menuFile.DropDownItems.Add($menuSave)

# Menu: File -> Exit

Con el Agregar_Click método, puede agregar una acción de clic a un elemento del menú (en este ejemplo, hacer clic en el menú llamará a un método para cerrar el formulario y detener el script de PowerShell):

$menuExit.Text         = "Exit"

$menuExit.Add_Click({$main_Form.Close()})

[void]$menuFile.DropDownItems.Add($menuExit)

Ahora puede agregar la siguiente sección del menú:

# Menu: Help

$menuHelp.Text      = "Help"

[void]$menuMain.Items.Add($menuHelp)

# Menu: Help -> About

$menuAbout.Text      = "About"

$menuAbout.Add_Click({ShowAbout})

[void]$menuHelp.DropDownItems.Add($menuAbout)

Ejecute el script de PowerShell. Como puede ver, ha aparecido un menú horizontal con elementos de submenú anidados en la parte superior del formulario.

interfaz de usuario powershell

En el código de algunos elementos del menú, hemos agregado controladores para el evento Click en el elemento del menú: SaveFile, OpenFile, ShowAbout. Ahora debe definir las funciones que se llamarán cuando se haga clic en los elementos del menú.

Por ejemplo, agregue una función de PowerShell ShowAbout:

function ShowAbout {

[void] [System.Windows.MessageBox]::Show( "My simple PowerShell GUI script with dialog elements and menus v1.0", "About script", "OK", "Information" )

}

Interfaz gráfica de usuario de PowerShell

Pista. Para la comodidad de sus usuarios, puede convertir sus secuencias de comandos de PowerShell de texto en aplicaciones EXE con todas las funciones. Puedes usar el PS2EXE módulo para convertir el script de PS1 a EXE.

  1. Instale el módulo desde la Galería de PowerShell:
    Install-Module ps2exe -Repository PSGallery
  2. Convierta su archivo de script de PS1 en un archivo EXE:
    ps2exe -inputFile "C:\PS\posh_gui.ps1" -outputFile "C:\PS\posh_gui.exe"

    interfaz gráfica de usuario

Uso de componentes de diálogo estándar de Windows en secuencias de comandos de PowerShell

Puede utilizar algunos de los diálogos gráficos estándar de Windows para informar al usuario y pedirle que elija. Echemos un vistazo a algunas de las llamadas de ventana de gráficos estándar en PowerShell.

Puede mostrar una ventana modal simple con texto y botones usando la clase System.Windows.MessageBox. Use MessageBox para notificar al usuario cuando se hace algo o para obtener una respuesta a una pregunta simple.

El mensaje es un atributo MessageBox obligatorio. El título, el botón y el icono son opcionales.

Por ejemplo, para mostrar solo un cuadro de mensaje OK:

[void] [System.Windows.MessageBox]::Show( "All changes have been implemented successfully ", "Script completed", "OK", "Information" )

Mostrar un cuadro de mensaje que requiere una respuesta (SíNoCancelar):

$answer = [System.Windows.MessageBox]::Show( "Dou you want to remove this user?", " Removal Confirmation", "YesNoCancel", "Warning" )

ejemplos de interfaz gráfica de usuario de powershell

Preguntar a un usuario por las credenciales y dividirlo en dos variables:

$creds = Get-Credential $UserName

$getUsername = $creds.GetNetworkCredential( ).UserName

$getPassword = $creds.GetNetworkCredential( ).Password

powershell crear interfaz gráfica de usuario

Mostrar el valor predeterminado Cuadro de diálogo de selección de archivo de Windows con un filtro por nombre de archivo:

Add-Type -AssemblyName System.Windows.Forms

$initialDirectory = [Environment]::GetFolderPath('Desktop')

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

$OpenFileDialog.InitialDirectory = $initialDirectory

$OpenFileDialog.Filter="Script files (*.ps1;*.cmd;*.bat)|*.ps1;*.bat;*.cmd"

$OpenFileDialog.Multiselect = $false

$response = $OpenFileDialog.ShowDialog( ) # $response can return OK or Cancel

if ( $response -eq 'OK' ) { Write-Host 'You selected the file:' $OpenFileDialog.FileName }

diseñador de la interfaz gráfica de usuario de PowerShell

Abre el Busca por carpetas caja de diálogo:

$shell = New-Object -ComObject Shell.Application

$selectedfolder = $shell.BrowseForFolder( 0, 'Select a folder to proceed', 16, $shell.NameSpace( 17 ).Self.Path ).Self.Path

generador de interfaz gráfica de usuario powershell

Seleccionar impresora formulario de diálogo:

Add-Type -AssemblyName System.Windows.Forms

$prntdlg = New-Object System.Windows.Forms.PrintDialog

$prntdlg.AllowCurrentPage = $false

$prntdlg.AllowPrintToFile = $trur

$prntdlg.AllowSelection = $false

$prntdlg.AllowSomePages = $true

$prntdlg.ShowNetwork = $true

$response = $prntdlg.ShowDialog( )# $response can return OK or Cancel

if ( $response -eq 'OK' ) { Write-Host 'Selected printer:' $prntdlg.PrinterSettings.PrinterName }

interfaz gráfica de usuario para powershell

Otro comando útil de PowerShell para mostrar información gráfica de un script a un usuario es Out-GridView. Puede usar el cmdlet Out-GridView para mostrar cualquier dato (atributos de objetos de PowerShell) en forma de cuadrícula gráfica, donde puede filtrarlos y ordenarlos según los criterios que desee.

Por ejemplo, el siguiente script de verificación del estado del servicio de PowerShell enumera los servicios que se ejecutan en Windows.

El usuario debe seleccionar los servicios deseados (se pueden seleccionar varias líneas manteniendo pulsada la tecla Control key) y guarde la selección en una variable.

$Svcs = Get-Service | Where-Object {$_.Status -EQ "Running"}| Out-GridView -Title "List of running services" -PassThru| Select -ExpandProperty Name

interfaz gráfica de usuario de PowerShell

Ahora puede usar la lista de servicios seleccionados por el usuario en Out-GridView para su posterior procesamiento en su secuencia de comandos de PowerShell.

El -Pasar a través de La opción se usa para pasar los objetos seleccionados en la tabla a través de la canalización a través de la canalización estándar de PowerShell.

Pista. Otros ejemplos del uso del cmdlet Out-GridView se describen en los siguientes artículos:

Creación de la GUI de los scripts de PowerShell con Visual Studio

Puede usar Visual Studio con WPF (Windows Presentation Foundation) como un simple generador de GUI de PowerShell. Descargue e instale la versión de Visual Studio Community 2019.

WPF es una parte de .NET Framework que se puede usar para visualizar interfaces de usuario en aplicaciones de Windows.

Ejecute Microsoft Visual Studio y cree un nuevo proyecto (Archivo > Nuevo > Proyecto). Seleccione Visual C# > Aplicación de Windows Forms (.NET Framework)

interfaz gráfica de usuario en powershell

Use el elemento Windows Forms en el panel izquierdo de la Caja de herramientas para colocar su elemento de control en el formulario (con arrastrar y soltar).

crear interfaz gráfica de usuario para el script de PowerShell

Visual Studio generará un código XAML para usted. Guarde este código en el archivo C:\PS\Script\MainWindow.xaml. Abra este archivo con el Bloc de notas y elimine la siguiente cadena:

x:Class="test.MainWindow”

Y guarde los cambios en el archivo XAML.

Ahora puede leer este código XAML desde su secuencia de comandos de PowerShell y mostrar un formulario de Windows.

Usa la siguiente función para cargar el objeto XAML:

$XamlPath = “C:\PS\Script\MainWindow.xaml”

[xml]$Global:xmlWPF = Get-Content -Path $XamlPath

try{

Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,system.windows.forms

} catch {

Throw "Failed to load WPF."

}

$Global:xamGUI = [Windows.Markup.XamlReader]::Load((new-object System.Xml.XmlNodeReader $xmlWPF))

$xmlWPF.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | %{

Set-Variable -Name ($_.Name) -Value $xamGUI.FindName($_.Name) -Scope Global

}

Para mostrar su formulario use:

$xamGUI.ShowDialog()

También hay varios proyectos comerciales que facilitan la generación de formularios de plantillas gráficas para PowerShell para sus scripts (como el Diseñador de GUI de PowerShell en línea en https://poshgui.com/).

5/5 - (161 votos)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *