Excesso de trabalho do ótimo script de Ingo Karstein com suporte GUI. A saída e entrada da GUI são ativadas com um switch, executáveis reais do Windows são gerados. Compila apenas com e para Powershell 5.x. Com front end gráfico opcional Win-PS2EXE.
Versão do módulo.
Você encontra a versão baseada em script aqui (https://github.com/MScholtes/TechNet-Gallery).
Autor: Markus Scholtes
Versão: 1.0.14
Data: 15/09/2024
PS C: > Install-Module ps2exe
ou baixe aqui: https://www.powershellgallery.com/packages/ps2exe/.
Invoke-ps2exe .source.ps1 . target.exe
ou
ps2exe .source.ps1 . target.exe
compila "source.ps1" no executável target.exe (se ".target.exe" for omitido, a saída será gravada em ".source.exe").
ou inicie o Win-PS2EXE para um front end gráfico com
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)
Um executável gerado possui os seguintes 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.
Os comandos básicos de entrada/saída tiveram que ser reescritos em C# para PS2EXE. Não implementados estão Write-Progress no modo console (muito trabalho) e Start-Transcript / Stop-Transcript (sem implementação de referência adequada pela Microsoft).
Por padrão, no PowerShell, as saídas de commandlets são formatadas linha por linha (como uma matriz de strings). Quando seu comando gera 10 linhas de saída e você usa a saída GUI, 10 caixas de mensagem aparecerão, cada uma aguardando um OK. Para evitar isso, envie seu comando para o comando Out-String. Isso converterá a saída em um array de string com 10 linhas, toda a saída será mostrada em uma caixa de mensagem (por exemplo: dir C: | Out-String).
PS2EXE pode criar arquivos de configuração com o nome do executável gerado + ".config". Na maioria dos casos esses arquivos de configuração não são necessários, eles são um manifesto que informa qual versão do .Net Framework deve ser usada. Como você normalmente usará o .Net Framework real, tente executar seu executável sem o arquivo de configuração.
Os scripts compilados processam parâmetros como o script original. Uma restrição vem do ambiente Windows: para todos os executáveis todos os parâmetros possuem o tipo STRING, se não houver conversão implícita para o seu tipo de parâmetro você deverá converter explicitamente em seu script. Você pode até canalizar conteúdo para o executável com a mesma restrição (todos os valores canalizados têm o tipo STRING).
Nunca armazene senhas em seu script compilado! Pode-se simplesmente descompilar o script com o parâmetro -extract. Por exemplo
Output.exe - extract:C:Output.ps1
irá descompilar o script armazenado em Output.exe.
Como o PS2EXE converte um script em um executável, as variáveis relacionadas ao script não estão mais disponíveis. Especialmente a variável $PSScriptRoot está vazia.
A variável $MyInvocation é definida com outros valores além de um script.
Você pode recuperar o script/caminho executável independente de compilado/não compilado com o seguinte código (graças 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 = " . " } }
Quando uma janela externa é aberta em um script com o modo -noConsole (ou seja, para Get-Credential ou para um comando que precisa de um shell cmd.exe), a próxima janela é aberta em segundo plano.
A razão para isso é que ao fechar a janela externa, o Windows tenta ativar a janela pai. Como o script compilado não possui janela, a janela pai do script compilado é ativada, normalmente a janela do Explorer ou Powershell.
Para contornar isso, $Host.UI.RawUI.FlushInputBuffer() abre uma janela invisível que pode ser ativada. A seguinte chamada de $Host.UI.RawUI.FlushInputBuffer() fecha esta janela (e assim por diante).
O exemplo a seguir não abrirá mais uma janela em segundo plano, pois uma única chamada de "ipconfig | Out-String" fará:
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
converteu arquivos de UTF-16 para UTF-8 para permitir git diff
ignore as chaves de controle na solicitação de string segura no modo console