Revisión del gran guión de Ingo Karstein con soporte GUI. La salida y la entrada de la GUI se activan con un interruptor, se generan ejecutables de Windows reales. Con soporte para Powershell 5.xy interfaz gráfica.
Versión del módulo.
La versión basada en scripts se puede encontrar aquí (https://github.com/MScholtes/TechNet-Gallery) y aquí: PS2EXE-GUI: «Convertir» scripts de PowerShell en archivos EXE con GUI.
Autor: Markus Scholtes
Versión: 1.0.10
Fecha: 2021-04-10
instalación
Install-Module ps2exe «>
PS C:> Install-Module ps2exe
(en Powershell V4, es posible que primero deba instalar PowershellGet) o descargarlo aquí: https://www.powershellgallery.com/packages/ps2exe/.
propósito de uso
Invoke-ps2exe .source.ps1 .target.exe
o
ps2exe .source.ps1 .target.exe
compila «source.ps1» en el archivo ejecutable target.exe (si se omite «. target.exe», la salida se escribe en «. source.exe»).
o inicie Win-PS2EXE para una interfaz gráfica
parámetro
‘ [[-outputFile] »] [-prepareDebug] [-x86|-x64] [-lcid ] [-STA|-MTA] [-noConsole] [-UNICODEEncoding] [-credentialGUI] [-iconFile »] [-title »] [-description »] [-company »] [-product »] [-copyright »] [-trademark »] [-version »] [-configFile] [-noOutput] [-noError] [-noVisualStyles] [-requireAdmin] [-supportOS] [-virtualize] [-longPaths] «>
ps2exe [-inputFile] '<file_name>' [[-outputFile] '<file_name>'] [-prepareDebug][-x86|-x64] [-lcid <id>] [-STA|-MTA] [-noConsole] [-UNICODEEncoding][-credentialGUI] [-iconFile '<filename>'] [-title '<title>'] [-description '<description>'][-company '<company>'] [-product '<product>'] [-copyright '<copyright>'] [-trademark '<trademark>'][-version '<version>'] [-configFile] [-noOutput] [-noError] [-noVisualStyles] [-requireAdmin][-supportOS] [-virtualize] [-longPaths]
Depurar x86 o x64 = compilar solo para tiempo de ejecución de 32 bits o 64 bits lcid = ID de sitio para el ejecutable compilado. Cultura del usuario actual, si no se especifica STA o MTA = modo ‘Single Thread Apartment’ o ‘Multi Thread Apartment’ noConsole = el archivo ejecutable resultante es una aplicación de Windows Forms sin una ventana de consola UNICODEEncoding = codificar la salida como UNICODE en modo de consola credentialGUI = usar GUI para consulta de credenciales en modo consola iconFile = Nombre del archivo de icono para el archivo ejecutable compilado title = Información del título (que se muestra en la pestaña Detalles del cuadro de diálogo de propiedades del Explorador de Windows) descripción = Información de descripción (no se muestra, pero está incrustada en el ejecutable archivo) empresa = Información de la empresa (no se muestra), pero incrustada en el archivo ejecutable) Producto = Información del producto (se muestra en la pestaña de detalles del cuadro de diálogo de propiedades del Explorador de Windows) copyright = Información de copyright (se muestra en la pestaña de detalles de las propiedades del Explorador de Windows) diálogo) Marcas comerciales = Información de marca comercial n (mostrado en la pestaña de detalles del diálogo de propiedades del Explorador de Windows) Versión = información de la versión (mostrado en la pestaña Detalles del diálogo de propiedades del Explorador de Windows) configFile = escribir archivo de configuración (.exe.config) noOutput = el ejecutable resultante no genera cualquier salida estándar (incluido el canal detallado y de información) noError = el ejecutable resultante no genera ninguna salida de error (incluidos los canales de advertencia y depuración) noVisualStyles = deshabilitar estilos visuales para una aplicación de GUI de Windows generada (solo con -noConsole) requireAdmin = si UAC es habilitado, ejecutable compilado solo se ejecuta en un contexto superior (se muestra el cuadro de diálogo UAC si es necesario) supportOS = usar funciones de las últimas versiones de Windows (ejecutar). [Environment]:: OSVersion para ver la diferencia) virtualize = la virtualización de la aplicación está habilitada (fuerza el tiempo de ejecución x86) longPaths = habilita rutas largas (> 260 caracteres) si está habilitado en el sistema operativo (solo funciona con Windows 10) «>
inputFile = Powershell script that you want to convert to executable (file has to be UTF8 or UTF16 encoded)outputFile = destination executable file name or folder, defaults to inputFile with extension '.exe'prepareDebug = create helpful information for debugging x86 or x64 = compile for 32-bit or 64-bit runtime onlylcid = location ID for the compiled executable. Current user culture if not specifiedSTA or MTA = 'Single Thread Apartment' or 'Multi Thread Apartment' modenoConsole = the resulting executable will be a Windows Forms app without a console windowUNICODEEncoding = encode output as UNICODE in console modecredentialGUI = use GUI for prompting credentials in console modeiconFile = icon file name for the compiled executabletitle = title information (displayed in details tab of Windows Explorer's properties dialog)description = description info rmation (not displayed, but embedded in executable)company = company information (not displayed, but embedded in executable)product = product information (displayed in details tab of Windows Explorer's properties dialog)copyright = copyright information (displayed in details tab of Windows Explorer's properties dialog)trademark = trademark information (displayed in details tab of Windows Explorer's properties dialog)version = version information (displayed in details tab of Windows Explorer's properties dialog)configFile = write config file (<outputfile>.exe.config)noOutput = the resulting executable will generate no standard output (includes verbose and information channel)noError = the resulting executable will generate no error output (includes warning and debug channel)noVisualStyles = disable visual styles for a generated windows GUI application (only with -noConsole) requireAdmin = if UAC is enabled, compiled executable run only in elevated context (UAC dialog appears if required)supportOS = use functions of newest Windows versions (execute [Environment]::OSVersion to see the difference)virtualize = application virtualization is activated (forcing x86 runtime)longPaths = enable long paths ( > 260 characters) if enabled on OS (works only with Windows 10)
Un ejecutable generado tiene los siguientes parámetros reservados:
Extracts the powerShell script inside the executable and saves it as FILENAME. The script will not be executed. -wait At the end of the script execution it writes «Hit any key to exit…» and waits for a key to be pressed. -end All following options will be passed to the script inside the executable. All preceding options are used by the executable itself and will not be passed to the script. «>
-debug Forces the executable to be debugged. It calls "System.Diagnostics.Debugger.Launch()".-extract:<FILENAME> Extracts the powerShell script inside the executable and saves it as FILENAME.The script will not be executed.-wait At the end of the script execution it writes "Hit any key to exit..." and waits for a key to be pressed.-end All following options will be passed to the script inside the executable.All preceding options are used by the executable itself and will not be passed to the script.
Observaciones
Lista de cmdlets no implementados:
Los comandos básicos de entrada / salida tuvieron que reescribirse en C # para PS2EXE. No se implementan Progreso de escritura en modo consola (demasiado trabajo) y Iniciar transcripción/Detener la transcripción (no es una implementación de referencia adecuada de Microsoft).
Formateo de salida en modo GUI:
De forma predeterminada, la salida de los comandos en Powershell se formatea línea por línea (como una matriz de cadenas). Si su comando genera 10 líneas de salida y está utilizando la salida GUI, verá 10 cuadros de mensaje, cada uno esperando un OK. Para evitar esto, reenvíe su comando al Out-String Comandlet. Esto convierte la salida en una matriz de cadenas con 10 líneas, toda la salida se muestra en un cuadro de mensaje (por ejemplo: dir C: | Out-String).
Archivos de configuración:
PS2EXE puede crear archivos de configuración con el nombre del ejecutable generado + «.config». En la mayoría de los casos, estos archivos de configuración no son necesarios, son un manifiesto que indica qué versión de .Net Framework usar. Dado que normalmente utiliza el .Net Framework real, intente ejecutar su ejecutable sin el archivo de configuración.
Edición de parámetros:
Los scripts compilados procesan parámetros como el script original. Una limitación proviene del entorno de Windows: para todos los archivos ejecutables, todos los parámetros tienen el tipo STRING, si no hay una conversión implícita para su tipo de parámetro, debe convertir explícitamente en su script. Incluso puede reenviar contenido al ejecutable con la misma restricción (todos los valores pasados por canalización son de tipo STRING).
Seguridad de la contraseña:
¡Nunca guarde contraseñas en su script compilado! Simplemente puede descompilar el script con el parámetro -extract. Por ejemplo
Output.exe -extract:C:Output.ps1
descompila el script guardado en Output.exe.
Variables de secuencia de comandos:
Dado que PS2EXE convierte un script en un archivo ejecutable, las variables relacionadas con el script ya no están disponibles. En particular, la variable $ PSScriptRoot está vacía.
La variable $ MyInvocation se establece en valores diferentes a los de un script.
Puede obtener la ruta del script / ejecutable independientemente de si está compilado / no compilado con el siguiente código (gracias a JacquesFS):
if ($MyInvocation.MyCommand.CommandType -eq "ExternalScript"){ $ScriptPath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition }else{ $ScriptPath = Split-Path -Parent -Path ([Environment]::GetCommandLineArgs()[0]) if (!$ScriptPath){ $ScriptPath = "." } }
Ventana en segundo plano en modo -noConsole:
Si se abre una ventana externa en un script con el modo -noConsole (por ejemplo, para Get-Credential o para un comando que requiere un shell cmd.exe), la siguiente ventana se abre en segundo plano.
La razón de esto es que cuando se cierra la ventana externa, Window intenta activar la ventana principal. Dado que el script compilado no tiene ventana, la ventana de nivel superior del script compilado se activa en su lugar, generalmente la ventana Explorer o Powershell.
Para evitar esto, $ Host.UI.RawUI.FlushInputBuffer () abre una ventana invisible que se puede activar. La siguiente llamada a $ Host.UI.RawUI.FlushInputBuffer () cierra esta ventana (etc.).
El siguiente ejemplo ya no abre una ventana en segundo plano, como lo hace una sola llamada a «ipconfig | Out-String»:
$Host.UI.RawUI.FlushInputBuffer()ipconfig | Out-String$Host.UI.RawUI.FlushInputBuffer()
Cambios:
1.0.10 / 2021-04-10
- El parámetro OutputFile ahora acepta una carpeta de destino (sin un nombre de archivo)
1.0.9 / 2021-02-28
- nuevo parámetro UNICODEEncoding para salida como UNICODE
- Se modificó la depuración de parámetros a PrepareDebug.
- finalmente se atrevió a usar parámetros avanzados
1.0.8 / 2020-10-24
1.0.7 / 2020-08-21
- Corrección de errores para barras de progreso simultáneas en una canalización
1.0.6 / 2020-08-10
- El indicador de selección ahora se comporta como Powershell (solo en modo consola)
- (limitado) soporte para Powershell Core (inicia Windows Powershell en segundo plano)
- procesamiento fijo de valores de parámetros negativos
- Soporte para barras de progreso animadas (solo en modo noConsole)
1.0.5 / 2020-07-11
- Soporte para barras de progreso anidadas (solo en modo noConsole)
1.0.4 / 2020-04-19
- Application.EnableVisualStyles () como estándar para aplicaciones GUI, nuevo parámetro -noVisualStyles para evitar esto
1.0.3 / 2020-02-15
1.0.2 / 2020-01-08
1.0.1 / 2019-12-16
- Se solucionó el problema con «ancho de ventana ilimitado para ventanas GUI» en ps2exe.ps1 y Win-PS2EXE
1.0.0 / 2019-11-08
- primera versión estable del módulo
0.0.0 / 15-09-2019