Доработка великолепного скрипта Инго Карштайна с поддержкой GUI. Вывод и ввод графического интерфейса активируются одним переключателем, генерируются настоящие исполняемые файлы Windows. Компилируется только с Powershell 5.x и в него. С дополнительным графическим интерфейсом Win-PS2EXE.
Версия модуля.
Версию на основе сценария можно найти здесь (https://github.com/MScholtes/TechNet-Gallery).
Автор: Маркус Шольтес
Версия: 1.0.14
Дата: 15 сентября 2024 г.
PS C: > Install-Module ps2exe
или загрузите отсюда: https://www.powershellgallery.com/packages/ps2exe/.
Invoke-ps2exe .source.ps1 . target.exe
или
ps2exe .source.ps1 . target.exe
компилирует "source.ps1" в исполняемый файл target.exe (если ".target.exe" опущен, выходные данные записываются в ".source.exe").
или запустите Win-PS2EXE для графического интерфейса с помощью
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)
Сгенерированный исполняемый файл имеет следующие зарезервированные параметры:
-? [] 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.
Основные команды ввода/вывода пришлось переписать на C# для PS2EXE. Не реализованы Write-Progress в консольном режиме (слишком много работы) и Start-Transcript / Stop-Transcript (нет надлежащей эталонной реализации со стороны Microsoft).
По умолчанию в PowerShell выходные данные командлетов форматируются построчно (как массив строк). Когда ваша команда генерирует 10 строк вывода и вы используете вывод графического интерфейса, появится 10 окон сообщений, каждое из которых ожидает подтверждения. Чтобы предотвратить это, передайте команду командлету Out-String. Это преобразует выходные данные в один строковый массив из 10 строк, весь вывод будет отображаться в одном окне сообщения (например: dir C: | Out-String).
PS2EXE может создавать файлы конфигурации с именем сгенерированного исполняемого файла + «.config». В большинстве случаев эти файлы конфигурации не нужны, они представляют собой манифест, в котором указывается, какую версию .Net Framework следует использовать. Поскольку вы обычно используете настоящую .Net Framework, попробуйте запустить исполняемый файл без файла конфигурации.
Скомпилированные сценарии обрабатывают параметры так же, как и исходный сценарий. Одно ограничение связано со средой Windows: для всех исполняемых файлов все параметры имеют тип STRING; если для вашего типа параметра нет неявного преобразования, вам придется преобразовать его явно в вашем скрипте. Вы даже можете передать содержимое в исполняемый файл с тем же ограничением (все передаваемые значения имеют тип STRING).
Никогда не храните пароли в скомпилированном скрипте! Скрипт можно просто декомпилировать с параметром -extract. Например
Output.exe - extract:C:Output.ps1
декомпилирует сценарий, хранящийся в Output.exe.
Поскольку PS2EXE преобразует сценарий в исполняемый файл, переменные, связанные со сценарием, больше недоступны. Особенно пуста переменная $PSScriptRoot.
Переменной $MyInvocation присваиваются другие значения, отличные от значений в скрипте.
Вы можете получить путь к сценарию/исполняемому файлу независимо от скомпилированного/некомпилированного с помощью следующего кода (спасибо 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 = " . " } }
Когда внешнее окно открывается в сценарии с режимом -noConsole (т. е. для Get-Credential или для команды, которой требуется оболочка cmd.exe), следующее окно открывается в фоновом режиме.
Причина этого в том, что при закрытии внешнего окна Windows пытается активировать родительское окно. Поскольку скомпилированный скрипт не имеет окна, вместо него активируется родительское окно скомпилированного скрипта, обычно окно Explorer или Powershell.
Чтобы обойти эту проблему, $Host.UI.RawUI.FlushInputBuffer() открывает невидимое окно, которое можно активировать. Следующий вызов $Host.UI.RawUI.FlushInputBuffer() закрывает это окно (и так далее).
Следующий пример больше не будет открывать окно в фоновом режиме, как это сделает один вызов «ipconfig | Out-String»:
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
преобразованные файлы из UTF-16 в UTF-8, чтобы разрешить git diff
игнорировать управляющие ключи в запросе защищенной строки в режиме консоли