Как конвертировать сценарии Powershell с формата PS1 в EXE


05 апреля 2021


Конвертируем скрипты Powershell с формата PS1 в EXE на примерах

Для сценариев Powershell существует отдельный формат '.ps1'. Этот формат можно преобразовать в полноценный .exe файл. Кроме удобств использования exe файлов описанные способы преобразования покажут и функциональные преимущества. Часть преимуществ, которые можно заметить сразу:

  • политики - у вас могут блокироваться запуски сценариев имеющие расширения скриптовых языков;
  • понятное назначение - все пользователи Windows знают для чего нужны файлы с буквами .exe на конце названия. Расширение .ps1 может вызывать вопросы даже у администраторов;
  • запуск - exe файл запускается двойным кликом, а ps1 - через консоль с настроенной политикой безопасности;
  • редактирование - поместив сценарий Powershell в exe файл его будет сложнее отредактировать;
  • срытие консоли - простой запуск скриптов PS1 всегда вызывает окно консоли. Один из способов обойти его - с помощью exe файла.

Еще нужно отметить, что exe файл можно рассмотреть как архив с файлами. То есть мы можем поместить в 1 exe файл сам сценарий Powershell и файлы (например пароли, адреса, таблицы и т.д.). Это преимущество избавляет нас от ситуации с отсутствующими файлами и доступами к ним, которые могут быть у обычного сценария.

 

В большинстве программ, которые будут рассмотрены ниже, конвертация форматов называется "компиляция". На самом деле это не совсем так. По-большему счету они добавляют какой-то скрипт на C# поверх вашего сценария и упаковывают в exe (проще сказать "инкапсуляция"). Какого-то очень сложного процесса перевода сценария с одного языка на другой - нет.

В этой статье будут рассмотрено несколько способов создания .exe файлы из .ps1. Самыми удобными и легкими способами - являются первые 3. Способы должны подойти для интерпретаторов Powershell 5.1+ и 6-7+. В конце статьи есть таблица с итогами.

 

PS2EXE

Модуль ps2exe имеет консольный и графический режим работы. На мой взгляд PS2EXE - это самый простой и удобный способ создания EXE по следующим причинам:

  1. Доступен из репозитория Powershell;
  2. Единственное предназначение модуля - конвертация форматов;
  3. Есть консольный вариант и в стиле PS;

У этого способа так же есть и минус. Как сообщал автор проекта с помощью этого модуля, когда-то, был упакован в .exe вирус. После этого, некоторые антивирусы, стали срабатывать на файлы .exe упакованные этим модулем. Мой антивирус таких сигнатур не нашел. Проект популярный и имеет 200 звезд и с открытым кодом. Тем не менее доверять автору или нет - решать вам.

Установить его можно с помощью следующей команды:

Install-Module ps2exe -Repository PSGallery

Вам может пригодится основная информация по модулю, которую можно получить так:

Get-Module -ListAvailable | where name -eq ps2exe | select *

Установка ps2exe для конвертации файлов exe в Powershell

На скриншоте выше отмечена, например, ссылка на гитхаб, где есть обсуждение этого модуля и его возможностей.

Консоль

У модуля есть несколько алиасов, которые работают одинаково. Самый простой способ создания exe файла следующий:

Invoke-PS2EXE D:\script.ps1 D:\target.exe

# аналогичная команда
ps2exe -inputFile D:\script.ps1 -outputFile D:\target.exe

Конвертация файлов ps1 в exe в Powershell

У команды модуля есть ряд дополнительных параметров увидеть которые можно в справке:

ps2exe

Справка по компиляции файлов Powershell с ps2exe

Отмечу наиболее важные параметры:

  • x86-x64 - компиляция под определенную архитектуру. Если этого не указано, то используется значение по умолчанию (обе архитектуры);
  • title - заголовок консоли;
  • noConsole - не отображает консоль при запуске скрипта;
  • requireAdmin - запрашивать права администратора (UAC);
  • credentialGUI - вывод диалогового окна для ввода учетных данных.

Если вы используете параметр noConsole, обратите на разное поведение с выводом в stdout. Без указания параметра noConsole - все будет выведено в консоль, а с параметром - в диалоговые окна.

В примере ниже я создал exe файл, который выполняет одну команду "New-Item". Эта команда возвращает информацию о созданном объекте. Если вы не помещаете результат команды в переменную, то он попадает в stdout. Результат команды будет выведен построчно в диалоговых окнах:

Проблема с stdout в Powershell

Это можно было бы исправить поместив команду в переменную:

$com = New-Item -Path "D:/file_2"

GUI

PS2EXE доступен и в графическом варианте. Папка, в которой лежит файл для запуска GUI, указана в описании модуля (на скриншоте выше). Обычно это один из следующих путей:

# 32bit
C:\Program Files (x86)\WindowsPowerShell\Modules\ps2exe\

# 64bit
C:\Program Files\WindowsPowerShell\Modules\ps2exe\

В папке модуля будет папка с версией. Внутри этих папок файл 'Win-PS2EXE.exe'.

Конвертация файлов в exe в Powershell с GUI

Параметры графического интерфейса достаточно очевидны и не нуждаются в дополнительном объяснении.

 

IExpress 2.0

Отличительной особенностью этого способа в том, что он уже установлен в Windows. IExpress предназначен не только для сценариев Powershell. Основная задача программы создания .exe для установки и запуска программ и поэтому имеет больше возможностей. Запустить редактор вы можете через любую консоль:

iexpress.exe

IEXpress для конвертации Powershell файлов в exe

Большая часть выбора предназначена для случаев, если вы планируете установить какую-то программу (распаковать в Program Files, реестр и т.д.), а не просто запустить .exe. Из-за этого большую часть выбора можно оставить по умолчанию. На скриншоте выбраны те пункты, которые понадобятся вам для конвертации ps1 в exe:

Конвертация ps1 в exe c Powershell и IExpress

  1. В конце этих диалоговых окон у вас появится файл со всеми выборами и настройками, которые вы сделали. Этот файл можно импортировать тут что бы не повторять этих действий;
  2. Вам нужно создать exe файл, который будет распакован в памяти и запущен. Другие варианты, наверное, нужны для установки;
  3. Выбор заголовка окна после запуска .exe;
  4. Нужно ли у пользователя спрашивать разрешение на установку программы;

Конвертация ps1 в exe c Powershell и IExpress

  1. Нужен, если вы хотите ограничить права пользователя какой-то лицензией (EULA). Т.е. обычное пользовательское соглашение;
  2. Какие файлы вы планируете включить в пакет EXE. Это может быть, например, сертификат;
  3. Нужно указать скрипт и название программы, которые его запустит. Конечно это будет интерпретатор 'powershell.exe'. Так же может понадобится установить политику запуска скрипта на нужный уровень. Пример того что вы можете использовать: 
    powershell.exe -ExecutionPolicy Bypass -File "D:\script.ps1"
  4. Команда, которая будет запущена после предыдущего шага;
  5. Будет ли запущен файл в развернутом окне консоли, свернутом или скрытом варианте.

Конвертация ps1 в exe c Powershell и IExpress

  1. Сообщение, которое появляется после успешной установки. В случае обычного запуска файла оно не нужно;
  2. Путь, где должен быть создан файл exe;
  3. Пункты, которые используются в старых ОС и при установке программ. Скрывают от пользователя процесс копирования файлов и включают поддержку длинных имен файлов.
  4. Нужна ли перезагрузка;
  5. Файл конфигурации, который можно установить в самом 1-ом окне.

Останутся еще 2 окна, которые не будут иметь выборов. После этого появится файл .exe пригодный для запуска.

В IExpress, в отличие от других программ, нельзя установить требования к привилегиям. Вы либо явно запускаете программу от администратора или от обычного пользователя (в песочнице). 

 

ISE Steroids

В Windows есть собственный редактор для сценариев Powershell, который называется ISE (Integrated Scripting Environment). Для этого редактора существует расширение с названием ISE Steroids. Расширение добавляет множество функций и одна из функций - это конвертация файлов. Плюсы этого способа от следующих в том, что оно бесплатное, до сих пор поддерживается и является расширением (а не полноценной программой).

Существует несколько способов установки этого расширения. Самый простой из репозитория:

Install-Module -Name "ISESteroids" -Scope CurrentUser -Repository PSGallery -Force

После установки, в самом ISE нужно выполнить следующую команду:

Start-Steroids

Если при установке могут появиться ошибки. Это ожидаемая ситуация и исправить ее можно скачав пакет с официального сайта ISE Steroids или использовав другие методы описанные там же.

После установки расширения, зайдя в "Сервис", можно увидеть кнопку "Turn Code into EXE...":

Конвертация ps1 в exe c Powershell ISE Steroids

В новом окне настраивается версионность приложения, поведение окна консоли при запуске приложения, устанавливается иконка и привилегии для запуска. При нажатии на кнопку "Create Application" - нужно указать путь для сохранения готового файла:

Конвертация ps1 в exe c Powershell ISE Steroids

 

PS1 to EXE

Менее популярный проект, который уже около 2 лет не поддерживается и является редактором кода с возможностью конвертации. На официальном сайте и Github скачать программу нельзя и ее нужно искать по сайтам. Достаточно много минусов, что бы пользоваться этой программой в последнюю очередь.

Консоль

После установки файл, для запуска консоли, находится в одной из следующих папок:

# 32bit
C:\Program Files (x86)\Ps1 to Exe\

# 64bit
C:\Program Files\Ps1 to Exe\

Консольный вариант команды не несет принципов Powershell в наименовании ключей. "PS1 to exe" использует стиль CMD. Пример создания exe файла без показа консоли:

./Ps1_To_Exe.exe /ps1 "D:\script.ps1" /exe "D:\target.exe" /include "D:\temp.py" /invisible

Конвертация файлов Powershell ps1 в exe c PS1toEXE

Параметр /include добавляет в exe дополнительные файлы и папки.

Вывод справки:

.\Ps1_To_Exe.exe /? 

Справка PS1 to EXE

GUI

Графический интерфейс программы имеет так же встроенный редактор кода. После открытия файла мы увидим следующую картинку:

Графический редактор PS1 to EXE

Где:

  1. Файл, который будет добавлен в exe;
  2. Дополнительные настройки для конвертации;
  3. Выбор дополнительных файлов, если вы планировали их включить;
  4. Конвертация в exe.

 

VSCode и Powershell Pro Tools

VSCode - это современный редактор кода от Microsoft. Он поддерживает множество языков через разные расширения, в том числе и Powershell. Одно из таких расширений, Powershell Pro Tools, позволяет выполнять конвертацию ps1 в exe. Единственный плюс этого способа в том, если вы пользователь VSCode. Минут - расширение платное.

Выглядит это расширение следующим образом:

VSCode плагин для конвертации ps1 в exe

После установки расширения и открытии вашего скрипта вам нужно нажать кнопку в правом-верхнем углу экрана для создания .exe файла. При первом нажатии на кнопку, в корневой директории VSCode создается файл конфигурации с расширением "psd1". В этом файле, будет указан путь куда будет сохранен .exe файл:

Конвертация в VSCode файлов Powershell ps1 в exe

Конвертация в VSCode файлов Powershell ps1 в exe

 

Powershell Studio

Еще один способ создать exe это использовать Powershell Studion. Эта программа - крупный IDE, который разрабатывался специально под Powershell и, конечно, он является платным (45 дней trial).

После открытия файла в IDE нужно открыть настройки пакетов:

Конвертация файлов Powershell ps1 в exe с Powershell Studio

В главном окне вы должны выбрать интерпретатор для выполнения сценария Powershell. Скорее всего вам нужен будет 'Windows Powershell', а не более старшие версии, так как они не устанавливаются по умолчанию в Windows:

Выбор интерпретатора для конвертации ps1 в exe с Powershell Studio

В следующем окне нужно выбрать путь, где файл должен быть сохранен и выполнить билд:

Выбор места сохранения при конвертации файла Powershell ps1 в exe с Powershell Studio

У Powershell Studio есть много преимуществ. Например он может подписывать конвертированные файлы вашим сертификатом - такой возможности, в других программах, нет.

 

Остальные варианты

В статье перечислена только часть программ, которые могут выполнить конвертацию. Есть множество других программ. Например редактор PowerGUI. Этот проект был закрыт более 4 лет назад т.к. он был выкуплен компанией DELL. Инсталлятор можно найти только на не официальных  сайтах. Из-за отсутствия обновления и поддержки я не стал его включать в список.

Так же есть следующая найденная таблица, которая примерно суммирует написанное выше. Отмечу, что я нашел в ней ошибки - ISE Steroids, например, бесплатное расширение. Могут быть и другие...

Таблица сравнения программ для конвертации файлов с exe в ps1 Powershell

...

Теги: #powershell


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.