Для файлов сценариев PowerShell используется отдельное расширение *.ps1. Для запуска скриптов PS1 пользователям приходится открывать консоль PowerShell, cmd, или редактор кода (например, PowerShell ISE или VSCode). Если вы хотите, чтобы ваши пользователи могли легко запускать ваши скрипты PowerShell, вы можете сконвертировать PS1 файлы в формат исполняемого файла EXE.
Скомпилированные в EXE файлы PowerShell скрипты имеют следующие преимущества:
- Позволяют пользователям запускать скрипты привычным способом (простым двойным щелчком по EXE файлу) без открытия PowerShell консоли;
- Вы может скрыть от пользователей консоль выполнения PowerShell;
- Пользователи не смогут редактировать код вашего PowerShell скрипта;
- Запуск EXE файлов в Windows не блокируется политиками PowerShell Execution;
- В один исполняемый файл можно добавить дополнительный файлы
В этой статье мы рассмотрим несколько способов преобразования PowerShell скриптов в EXE файлы.
Преобразование PS1 скрипта в EXE с помощью PS2EXE
Для конвертация любого PowerShell скрипта в исполняемый EXE файл можно использовать утилиту ps2exe. Эта консольная утилита позволяет скомпилировать exe файл из вашего файла скрипта PS1.
Утилита ps2exe доступна для загрузки в галереи скриптов PowerShell по ссылке https://www.powershellgallery.com/packages/ps2exe/1.0.12
Для онлайн установки утилиты ps2exe из PSGallery в Windows, можно воспользоваться PowerShell командой Install-Module:
Install-Module -Name ps2exe
Теперь вы можете использовать команду Invoke-ps2exe для конвертации ваших PowerShell скриптов в исполняемые файлы. Например:
cd c:\PS
Invoke-ps2exe .\psscript.ps1 -outputFile .\psscript.exe
Скрипт скомпилирует exe файл из указанного файла PS1.
По умолчанию программа компилируется как консольное приложение. Если вам нужно Windows приложение, добавьте ключ noConsole. Такое приложение будет выводить все сообщения из консоли PowerShell в графическое диалоговое окно.
Скомпилированный exe файл по умолчанию имеет несколько дополнительных параметров. Например, при запуске с параметром –wait скрипт будет ждать реакции пользователя для завершения процесса.
Если скомпилировать PS1 файл с параметрами noOutpup, noError и noConsole, то такой PowerShell скрипт выполняется полностью незаметно для пользователя (можно использовать в качестве логон скрипта в Windows).
Полный список всех доступных опций утилиты ps2exe можно получить, выполнив:
get-help Invoke-ps2exe
или выполнив команду Invoke-ps2exe без параметров.
Есть графическая версия скрипта Win-PS2EXE. Здесь вы можете указать нужные параметры для компиляции в графическом интерфейсе.
Обратите внимание, что PowerShell скрипты, скомпилированные таким образом будут выполняться независимо от настроек PowerShell Execution Policy на компьютере.
PS2exe при компиляции скриптов оборачивает код вашего PowerShell скрипта в код C#. Полученный exe файл представляет собой сборку .Net, содержащую исходный скрипт в кодировке Base64. Для работы exe файла на компьютере должны быть установлены PowerShell и .Net Framework 2.0+.
.\your_app_file.exe -extract:"script_source.ps1"
Используем IExpress для конвертации PS1 в EXE
В Windows есть встроенное средство IExpress 2.0, которое можно использовать для конвертации PowerShell скрипта PS1 в EXE файл. Выполните команду:
iexpress.exe
Затем последовательно выберите:
Create new Self Extraction Directive file -> Extract files and run an installation command -> укажите названия пакета (например myPS1_to_exe) -> no prompt -> do not display a license -> укажите путь к вашему PS1 файлу.
Можете добавить дополнительный файлы в пакет со скриптом (конфиг / ini файлы, сертификаты).
Укажите команду для запуска скрипта:
powershell.exe -ExecutionPolicy Bypass -File myposh1.ps1
Выберите режим запуска (я использую Hidden).
Можно указать сообщение, которое появится после запуска файла.
Затем укажите каталог и имя исполняемого EXE файла, которые нужно сгенерировать. Можно отметить опцию Hide File Extracting Progress Animation from User.
Выберите нужно ли перезагрузка.
В результате вы получите исполняемый exe файл.
Для сред разработки доступны платные инструменты для конвертации PS1 в EXE. Например:
- Powershell Pro Tools для VSCode
- Powershell Studio