Trabajo excesivo del gran guión de Ingo Karstein con soporte GUI. La salida y entrada de la GUI se activa con un interruptor, se generan ejecutables reales de Windows. Se compila solo con y para Powershell 5.x. Con interfaz gráfica opcional Win-PS2EXE.
Versión del módulo.
Encontrará la versión basada en script aquí (https://github.com/MScholtes/TechNet-Gallery).
Autor: Markus Scholtes
Versión: 1.0.14
Fecha: 2024-09-15
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 obtener una interfaz gráfica con
Win - PS2EXE
ps2exe [ - inputFile ] ' ' [[ - outputFile ] ' ' ]
[ - prepareDebug ] [ - x86 | - x64 ] [ - lcid < id > ] [ - STA | - MTA ] [ - noConsole ] [ - UNICODEEncoding ]
[ - credentialGUI ] [ - iconFile ' ' ] [ - title ' ' ] [ - description ' ' ]
[ - company ' ' ] [ - product ' ' ] [ - copyright ' ' ] [ - trademark ' ' ]
[ - version ' ' ] [ - configFile ] [ - noOutput ] [ - noError ] [ - noVisualStyles ] [ - exitOnCancel ]
[ - DPIAware ] [ - requireAdmin ] [ - supportOS ] [ - virtualize ] [ - longPaths ]
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 only
lcid = location ID for the compiled executable. Current user culture if not specified
STA or MTA = 'Single Thread Apartment' or 'Multi Thread Apartment' mode
noConsole = the resulting executable will be a Windows Forms app without a console window
UNICODEEncoding = encode output as UNICODE in console mode
credentialGUI = use GUI for prompting credentials in console mode
iconFile = icon file name for the compiled executable
title = title information (displayed in details tab of Windows Explorer's properties dialog)
description = description information (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 (.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)
exitOnCancel = exits program when Cancel or "X" is selected in a Read-Host input box (only with -noConsole)
DPIAware = if display scaling is activated, GUI controls will be scaled if possible (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:
-? [] Powershell help text of the script inside the executable. The optional parameter combination
"-? -detailed", "-? -examples" or "-? -full" can be used to get the appropriate help text.
-debug Forces the executable to be debugged. It calls "System.Diagnostics.Debugger.Launch()".
-extract: 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.
Los comandos básicos de entrada/salida tuvieron que reescribirse en C# para PS2EXE. No implementados son Write-Progress en modo consola (demasiado trabajo) y Start-Transcript / Stop-Transcript (no hay una implementación de referencia adecuada por parte de Microsoft).
De forma predeterminada, en PowerShell, las salidas de los comandos están formateadas línea por línea (como una matriz de cadenas). Cuando su comando genera 10 líneas de salida y usa la salida GUI, aparecerán 10 cuadros de mensaje, cada uno esperando una aprobación. Para evitar que esto canalice su comando al comando Out-String. Esto convertirá la salida en una matriz de cadenas con 10 líneas, toda la salida se mostrará en un 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, esos archivos de configuración no son necesarios, son un manifiesto que indica qué versión de .Net Framework se debe usar. Como normalmente utilizará el .Net Framework real, intente ejecutar el 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 Windows: para todos los 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 puedes 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! Simplemente se puede descompilar el script con el parámetro -extract. Por ejemplo
Output.exe - extract:C:Output.ps1
descompilará el script almacenado en Output.exe.
Dado que PS2EXE convierte un script en un ejecutable, las variables relacionadas con el script ya no están disponibles. Especialmente la variable $PSScriptRoot está vacía.
La variable $MyInvocation se establece en valores distintos a los de un script.
Puede recuperar el script/ruta 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 = " . " } }
Cuando se abre una ventana externa en un script con el 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 de esto 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 de Explorer o Powershell.
Para solucionar esto, $Host.UI.RawUI.FlushInputBuffer() abre una ventana invisible que se puede activar. La siguiente llamada de $Host.UI.RawUI.FlushInputBuffer() cierra esta ventana (y así sucesivamente).
El siguiente ejemplo ya no abrirá una ventana en segundo plano, ya que bastará con una sola llamada a "ipconfig | Out-String":
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
archivos convertidos de UTF-16 a UTF-8 para permitir git diff
ignorar las claves de control en la solicitud de cadena segura en modo consola