
Módulo para compilar scripts de PowerShell a ejecutables.
Refinamiento del gran script de Ingo Karstein con soporte GUI. La salida y entrada GUI se activan con un solo interruptor, se generan ejecutables reales de Windows. Compila solo scripts compatibles con PowerShell 5.x. Con interfaz gráfica opcional Win-PS2EXE.
Versión del módulo.
Puede encontrar la versión basada en script aquí (https://github.com/MScholtes/TechNet-Gallery).
Autor: Markus Scholtes
Versión: 1.0.18
Fecha: 2026-06-06
PS C:\> Install-Module ps2exe
o descárguelo desde aquí: https://www.powershellgallery.com/packages/ps2exe/.
Invoke-ps2exe .\source.ps1 .\target.exe
o
ps2exe .\source.ps1 .\target.exe
compila "source.ps1" en el ejecutable target.exe (si se omite ".\target.exe", la salida se escribe en ".\source.exe").
o inicie Win-PS2EXE para una interfaz gráfica con
Win-PS2EXE
ps2exe [-inputFile] '<file_name>' [[-outputFile] '<file_name>']
[-prepareDebug] [-x86|-x64] [-lcid <id>] [-STA|-MTA] [-noConsole] [-conHost] [-UNICODEEncoding]
[-credentialGUI] [-iconFile '<filename>'] [-$embedFiles <hashtable>] [-title '<title>'] [-description '<description>']
[-company '<company>'] [-product '<product>'] [-copyright '<copyright>'] [-trademark '<trademark>']
[-version '<version>'] [-configFile] [-noOutput] [-noError] [-noVisualStyles] [-exitOnCancel]
[-DPIAware] [-requireAdmin] [-supportOS] [-virtualize] [-longPaths]
inputFile = Script de PowerShell que desea convertir a ejecutable (el archivo debe estar codificado en UTF8 o UTF16)
outputFile = Nombre o carpeta del archivo ejecutable de destino; por defecto, inputFile con extensión '.exe'
prepareDebug = Crea información útil para la depuración
x86 or x64 = Compilar solo para tiempo de ejecución de 32 o 64 bits
lcid = ID de ubicación para el ejecutable compilado. Se usa la configuración regional del usuario actual si no se especifica
STA or MTA = Modo 'Single Thread Apartment' o 'Multi Thread Apartment'
noConsole = El ejecutable resultante será una aplicación de Windows Forms sin ventana de consola
conHost = Forzar inicio con conhost como consola en lugar de Windows Terminal (deshabilita redirecciones)
UNICODEEncoding = Codificar la salida como UNICODE en modo consola
credentialGUI = Usar GUI para solicitar credenciales en modo consola
iconFile = Nombre del archivo de icono para el ejecutable compilado
embedFiles = Archivos a incrustar dados como hash, se extraerán según la clave del hash, los nombres de archivo de origen deben ser únicos
(p. ej., -embedFiles @{'RutaArchivoDestino'='RutaArchivoOrigen'} )
title = Información del título (se muestra en la pestaña de detalles del cuadro de diálogo de propiedades del Explorador de Windows)
description = Información de descripción (no se muestra, pero se incrusta en el ejecutable)
company = Información de la empresa (no se muestra, pero se incrusta en el ejecutable)
product = 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 del cuadro de diálogo de propiedades del Explorador de Windows)
trademark = Información de marca comercial (se muestra en la pestaña de detalles del cuadro de diálogo de propiedades del Explorador de Windows)
version = Información de versión (se muestra en la pestaña de detalles del cuadro de diálogo de propiedades del Explorador de Windows)
configFile = Escribir archivo de configuración (<outputfile>.exe.config)
noOutput = El ejecutable resultante no generará salida estándar (incluye canalización verbose e información)
noError = El ejecutable resultante no generará salida de error (incluye canalización warning y depuración)
noVisualStyles = Deshabilitar estilos visuales para una aplicación GUI de Windows generada (solo con -noConsole)
exitOnCancel = Sale del programa cuando se selecciona Cancelar o "X" en un cuadro de entrada Read-Host (solo con -noConsole)
DPIAware = Si la escala de pantalla está activada, los controles GUI se escalarán si es posible (solo con -noConsole)
requireAdmin = Si UAC está habilitado, el ejecutable compilado se ejecuta solo en contexto elevado (aparece el diálogo de UAC si es necesario)
supportOS = Utiliza funciones de las versiones más recientes de Windows (ejecute [Environment]::OSVersion para ver la diferencia)
virtualize = Se activa la virtualización de la aplicación (forzando el tiempo de ejecución x86)
longPaths = Habilitar rutas largas (> 260 caracteres) si está habilitado en el SO (solo funciona con Windows 10)
Un ejecutable generado tiene los siguientes parámetros reservados:
-? [<MODIFIER>] Texto de ayuda de PowerShell del script dentro del ejecutable. La combinación de parámetros opcional
"-? -detailed", "-? -examples" o "-? -full" se puede utilizar para obtener el texto de ayuda correspondiente.
-debug Fuerza la depuración del ejecutable. Llama a "System.Diagnostics.Debugger.Launch()".
-extract:<FILENAME> Extrae el script de PowerShell dentro del ejecutable y lo guarda como FILENAME.
El script no se ejecutará.
-wait Al final de la ejecución del script escribe "Hit any key to exit..." y espera que se presione una tecla.
-end Todas las opciones siguientes se pasarán al script dentro del ejecutable.
Todas las opciones anteriores son utilizadas por el propio ejecutable y no se pasarán al script.
PS2EXE se puede usar con PowerShell Core. Para hacerlo, simplemente instale el módulo PS2EXE en PowerShell Core como se describió anteriormente. Pero dado que .Net Core no incluye un compilador, se usa el compilador de .Net Framework (.Net Framework y PowerShell 5.1 están incluidos en Windows).
Por esta razón, PS2EXE solo puede compilar scripts compatibles con PowerShell 5.1 y genera binarios de .Net 4.x, pero aún se puede usar directamente en todos los sistemas operativos Windows compatibles sin dependencias.
Con el parámetro -embedFiles seguido de una tabla hash con rutas a archivos, esos archivos se incrustarán en el ejecutable compilado. Al iniciar el ejecutable, esos archivos se escribirán en el disco en las rutas especificadas, p. ej., -embedFiles @{'RutaArchivoDestino1'='RutaArchivoOrigen1';'RutaArchivoDestino2'='RutaArchivoOrigen2'}. Los nombres de archivo de origen deben ser únicos. Se permiten rutas absolutas y relativas. Para las rutas de destino, una ruta relativa que comienza con '.\' se interpreta como relativa al ejecutable, sin el '.\' inicial como relativa a la ruta actual en tiempo de ejecución. Los directorios se crean automáticamente al inicio si es necesario. En la ruta de destino, las variables de entorno en notación cmd.exe como %TEMP% o %APPDATA% se expanden en tiempo de ejecución. Un error al crear uno de los archivos incrustados detendrá inmediatamente la ejecución del ejecutable compilado.
Los comandos básicos de entrada/salida tuvieron que reescribirse en C# para PS2EXE. No están implementados Write-Progress en modo consola (demasiado trabajo) y Start-Transcript/Stop-Transcript (no hay una implementación de referencia adecuada de Microsoft).
Por defecto, en PowerShell las salidas de los cmdlets se formatean línea por línea (como una matriz de cadenas). Cuando su comando genera 10 líneas de salida y utiliza la salida GUI, aparecerán 10 cuadros de mensaje, cada uno esperando un Aceptar. Para evitar esto, canalice su comando al cmdlet Out-String. Esto convertirá la salida en una matriz de cadenas con 10 líneas, toda la salida se mostrará en un solo cuadro de mensaje (por ejemplo: dir C:\ | Out-String).
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 debe usarse. Como normalmente utilizará la versión actual de .Net Framework, intente ejecutar su ejecutable sin el archivo de configuración.
Los scripts compilados procesan los parámetros como lo hace el script original. Una restricción proviene del entorno de Windows: para todos los ejecutables, todos los parámetros tienen el tipo STRING; si no hay una conversión implícita para el tipo de su parámetro, debe convertir explícitamente en su script. Incluso puede canalizar contenido al ejecutable con la misma restricción (todos los valores canalizados tienen el tipo STRING).
¡Nunca almacene contraseñas en su script compilado! Se puede descompilar fácilmente el script con el parámetro -extract. Por ejemplo
Output.exe -extract:C:\Output.ps1
descompilará el script almacenado en Output.exe. Y tenga en cuenta: ¡el script (intencionalmente) se almacena en texto claro en el ejecutable!
Dado que PS2EXE convierte un script en un ejecutable, las variables relacionadas con el script ya no están disponibles. La variable $MyInvocation se establece en otros valores que en un script.
Especialmente la variable $PSScriptRoot está vacía: puede usar $ScriptRoot como reemplazo.
Puede obtener $PSScriptRoot independientemente de si está compilado o no con la siguiente línea de código:
if (!$PSScriptRoot) { $PSScriptRoot = $ScriptRoot }
Cuando se abre una ventana externa en un script con modo -noConsole (es decir, para Get-Credential o para un comando que necesita un shell cmd.exe), la siguiente ventana se abre en segundo plano.
La razón es que al cerrar la ventana externa, Windows intenta activar la ventana principal. Dado que el script compilado no tiene ventana, se activa la ventana principal del script compilado, normalmente la ventana del Explorador o de PowerShell.
Para solucionar esto, $Host.UI.RawUI.FlushInputBuffer() abre una ventana invisible que se puede activar. La siguiente llamada a $Host.UI.RawUI.FlushInputBuffer() cierra esta ventana (y así sucesivamente).
El siguiente ejemplo ya no abrirá una ventana en segundo plano como lo haría una sola llamada de "ipconfig | Out-String":
$Host.UI.RawUI.FlushInputBuffer()
ipconfig | Out-String
$Host.UI.RawUI.FlushInputBuffer()