PS2EXE 是一个 PowerShell 脚本编译工具,它可以将 PowerShell 脚本(.ps1 文件)转换为 Windows 可执行文件(.exe)。该工具的基础是 Ingo Karstein 的脚本,经过扩展以支持图形用户界面(GUI)。通过一个简单的开关,用户可以选择启用图形界面的输入输出功能,并生成真正的 Windows 可执行文件。
PowerShell Gallery | ps2exe 1.0.15
GitHub - MScholtes/PS2EXE: Module to compile powershell scripts to executables
PS2EXE
在 Ingo Karstein 的优秀脚本基础上进行扩展,支持图形用户界面(GUI)。通过一个开关激活 GUI 的输入输出,生成真实的 Windows 可执行文件。仅支持编译与 PowerShell 5.x 兼容的脚本。还可选择使用图形前端 Win-PS2EXE。
Ingo Karstein 脚本是一个用于将 PowerShell 脚本转换为独立的可执行文件(EXE)工具的脚本。这种脚本工具可以通过 PowerShell 将 PowerShell 脚本编译成 Windows 可执行文件,允许用户将脚本以应用程序的形式运行,而无需依赖于 PowerShell 环境。 特点和功能:
为什么使用:
该脚本提供了许多灵活的参数,使得 PowerShell 脚本的功能可以通过图形界面或命令行执行,尤其适合需要在 Windows 系统中分发和运行脚本的开发者。 |
Ingo Karstein 脚本的底层原理涉及将 PowerShell 脚本编译成独立的可执行文件(EXE),这是通过将 PowerShell 代码打包成 .NET 程序来实现的。具体的工作原理包括以下几个方面: 1. 使用 .NET 打包 PowerShell 脚本Ingo Karstein 脚本利用了 .NET 编译器技术,将 PowerShell 脚本嵌入到一个 .NET 应用程序中,从而将 PowerShell 代码打包成一个独立的可执行文件(EXE)。这使得原本需要在 PowerShell 环境中运行的脚本可以在没有 PowerShell 安装的机器上运行。底层是通过以下几个步骤来实现的:
2. 集成 PowerShell 环境为了使脚本能够在没有 PowerShell 环境的机器上运行,Karstein 脚本在 EXE 文件中集成了一个嵌入式 PowerShell 运行时。这意味着:
3. 图形界面和 Windows 窗体支持Ingo Karstein 脚本还允许用户通过 Windows 窗体(WinForms)为 PowerShell 脚本创建图形用户界面(GUI)。底层原理是:
4. 进度条和用户交互脚本支持多种类型的用户交互,包括命令行和图形界面的进度条。这些功能的实现依赖于:
5. 转换工具与编译器Ingo Karstein 脚本本身也提供了编译功能,这使得它能够将 PowerShell 脚本转换为 EXE 文件。它主要利用了以下技术:
总结Ingo Karstein 脚本的底层原理基于将 PowerShell 脚本与 .NET 技术结合,通过嵌入 PowerShell 引擎和 GUI 支持库,将脚本转换为独立的可执行文件。它不仅支持命令行模式,还能够创建图形界面,增强了脚本的可用性和跨平台兼容性。通过这种方式,用户可以在没有 PowerShell 环境的计算机上执行脚本,同时还可以提供丰富的用户交互和界面设计功能。 |
模块版本
脚本版本请参考 GitHub 页面。
作者:Markus Scholtes
版本:1.0.15
发布日期:2025年1月5日
PS2EXE 是一个 PowerShell 脚本编译工具,它可以将 PowerShell 脚本(.ps1 文件)转换为 Windows 可执行文件(.exe)。该工具的基础是 Ingo Karstein 的脚本,经过扩展以支持图形用户界面(GUI)。通过一个简单的开关,用户可以选择启用图形界面的输入输出功能,并生成真正的 Windows 可执行文件。
主要特点:
- GUI 支持:PS2EXE 允许在生成的可执行文件中启用图形用户界面,这对于需要用户交互的程序来说非常有用。
- PowerShell 5.x 兼容:它只支持将与 PowerShell 5.x 兼容的脚本编译为可执行文件。
- 简单的命令行操作:只需使用一个命令,便可以将 PowerShell 脚本转化为独立的可执行文件。
- 可选的图形前端:提供了一个图形界面工具 Win-PS2EXE,方便那些不熟悉命令行的用户操作。
使用场景:
- 将 PowerShell 脚本转化为可执行文件后,可以在没有 PowerShell 环境的机器上运行。
- 对于需要图形界面的 PowerShell 脚本,可以通过 PS2EXE 转换并启用 GUI,使其更加易用。
安装与使用:
- 通过 PowerShell 命令
Install-Module ps2exe
安装。 - 使用命令
Invoke-ps2exe .\source.ps1 .\target.exe
将 PowerShell 脚本编译为可执行文件。
PS2EXE 适用于需要将 PowerShell 脚本转化为可执行文件,并希望为最终用户提供简单图形界面交互的情况。
PS2EXE 的底层原理主要是基于 PowerShell 脚本与 Windows 可执行文件(.exe)的转换机制,利用了 PowerShell 的一些特性以及特定工具和框架来实现这一过程。以下是 PS2EXE 转换原理的核心组成部分:
1. 脚本嵌入机制
- 嵌入 PowerShell 脚本:PS2EXE 将 PowerShell 脚本文件(.ps1)嵌入到生成的可执行文件(.exe)中。这个过程类似于将脚本内容编码成一种特定的格式并包含在 .exe 文件内部。
- 数据资源嵌入:在可执行文件中,脚本通常作为二进制资源(例如,通过
.rsrc
部分)嵌入,而不是直接在可执行文件的代码中。因此,生成的 .exe 文件内部包含了整个 PowerShell 脚本,但它是隐藏在可执行文件中的,无法直接查看或修改。
2. 使用 PowerShell Host 环境
- PowerShell Host:PS2EXE 通过使用 Windows 中的 PowerShell 主机(Host)来加载并执行嵌入的 PowerShell 脚本。简单来说,它通过加载一个自定义的 PowerShell 环境,并运行嵌入的脚本。这使得脚本在没有 PowerShell 环境的情况下也能独立执行。
- 启动脚本:当执行编译后的 .exe 文件时,文件首先启动一个 PowerShell 主机,然后通过该主机解释和执行嵌入的 PowerShell 脚本。
3. 利用 C# 编写启动器
- C# 启动器代码:PS2EXE 工具本质上会生成一个 C# 编写的启动器,该启动器负责加载嵌入的 PowerShell 脚本并在 PowerShell 主机环境中运行它。C# 启动器是生成的 .exe 文件的“核心”,它会通过 Windows API 将 PowerShell 环境引入并初始化脚本执行过程。
- 无外部依赖:编译后的 .exe 文件不需要外部 PowerShell 依赖环境,因此它通过 C# 代码动态加载 PowerShell 脚本,使得其能够在没有 PowerShell 环境的系统中运行。
4. 可执行文件封装
- 打包为单一文件:在转换过程中,PS2EXE 将整个 PowerShell 脚本与启动代码打包成一个单一的可执行文件。这意味着,用户可以通过双击 .exe 文件,直接运行 PowerShell 脚本,而无需任何额外的配置。
- 文件大小增加:由于 PowerShell 脚本和启动器代码都被嵌入到可执行文件中,因此生成的 .exe 文件会比原始的 PowerShell 脚本文件要大。文件大小的增加与脚本复杂度和依赖项相关。
5. 图形界面支持
- 图形界面实现:当 PS2EXE 生成的可执行文件需要图形用户界面(GUI)时,工具会通过一个简单的 Windows Forms 应用程序框架,使用 C# 来创建窗口界面。这种方式使得用户可以在运行脚本时与之进行交互,而不是仅依赖命令行输入输出。
- GUI 调用:如果启用了图形界面选项,PS2EXE 会在 C# 启动器中集成一个基本的 GUI 组件(例如窗口、按钮等),并通过事件驱动机制(如点击按钮、文本框输入等)来触发 PowerShell 脚本中的功能。
6. 错误处理与调试机制
- 错误捕捉和日志记录:PS2EXE 在生成的 .exe 文件中集成了基本的错误捕捉和日志记录机制。当执行的 PowerShell 脚本遇到错误时,工具能够捕捉到这些错误并通过 C# 启动器进行处理。错误信息通常会输出到日志文件,或者通过图形界面显示给用户。
- 调试支持:由于生成的可执行文件是经过编译的,它不支持直接调试 PowerShell 脚本。但在开发过程中,开发者可以通过命令行工具或 GUI 工具调试脚本,确保无误后再进行编译。
7. 脚本加密与保护
- 脚本加密:通过将 PowerShell 脚本嵌入可执行文件,PS2EXE 提供了一定程度的脚本保护。尽管嵌入的脚本不是完全加密的,但它会隐藏在可执行文件中,增加了对脚本内容的访问难度。
- 安全性限制:虽然 PS2EXE 不对脚本进行加密,但嵌入式脚本的方式能有效防止普通用户查看和修改脚本内容,尤其是在分发给客户时,提供了一定的安全性。
总结
PS2EXE 通过将 PowerShell 脚本嵌入到一个 C# 编写的 Windows 可执行文件中,并利用 PowerShell 主机环境来执行这些脚本,实现了 PowerShell 脚本的独立运行。它的底层原理包括 PowerShell 脚本的封装、C# 启动器的创建、图形界面支持、错误处理机制、以及一定程度的脚本保护。
PS2EXE 的功能可以根据其特性和用途进行以下几类分类:
1. PowerShell 脚本编译
- 脚本编译为可执行文件:PS2EXE 的核心功能是将 PowerShell 脚本(.ps1 文件)转换为 Windows 可执行文件(.exe)。这一功能使得原本只能在 PowerShell 环境中运行的脚本,变得可以独立运行,无需依赖 PowerShell 环境。
2. 图形用户界面(GUI)支持
- GUI 开关:PS2EXE 允许用户通过开关启用图形用户界面(GUI)。当启用时,生成的可执行文件可以拥有用户界面,支持与用户的交互。
- 图形前端工具:提供 Win-PS2EXE 作为图形前端,便于用户通过简单的界面进行编译操作,而不需要使用命令行。
3. PowerShell 5.x 兼容性
- 仅支持 PowerShell 5.x 兼容脚本:PS2EXE 仅支持将与 PowerShell 5.x 版本兼容的脚本编译成可执行文件。因此,使用该工具的前提是脚本必须符合 PowerShell 5.x 的规范和功能。
4. 增强的可执行文件功能
- 包含脚本和依赖项:编译后的可执行文件将包含原始 PowerShell 脚本的所有内容,并且可能包括依赖项(如模块),使其能够在没有 PowerShell 环境的机器上正常运行。
- 输出为标准 .exe 文件:编译过程生成的是标准的 Windows 可执行文件,用户可以像运行其他程序一样运行这些文件,而无需预先安装 PowerShell。
5. 命令行与图形界面结合使用
- 命令行操作:PS2EXE 支持通过命令行工具进行操作,适合熟悉 PowerShell 的开发人员和系统管理员。
- 图形界面(Win-PS2EXE):对于不熟悉命令行的用户,PS2EXE 提供了 Win-PS2EXE 作为图形界面工具,简化了操作流程。
6. 可定制性和灵活性
- 参数和选项设置:PS2EXE 提供了多个参数和设置选项,允许用户根据需求自定义编译过程。例如,可以指定目标文件名、设置是否启用图形界面等。
总结:
PS2EXE 的功能涵盖了 PowerShell 脚本的编译、图形界面支持、PowerShell 5.x 的兼容性、可执行文件的生成,以及命令行和图形界面的结合使用。它为开发人员和管理员提供了便捷的工具,将 PowerShell 脚本转化为独立的可执行文件,使得脚本可以更广泛地分发和执行。
PS2EXE 的应用场景非常广泛,主要适用于以下几种情况:
1. 将 PowerShell 脚本转化为可执行文件
- 简化分发与执行:当你编写了一个 PowerShell 脚本,并希望在没有 PowerShell 环境的机器上运行时,可以使用 PS2EXE 将其转化为可执行文件(.exe)。这样,接收方不需要事先安装 PowerShell 环境,能够轻松运行该程序。
- 无需安装 PowerShell:某些企业环境可能不允许安装 PowerShell,或是 PowerShell 版本不兼容。通过将脚本转化为独立的可执行文件,解决了这些环境中的执行问题。
2. 创建带有图形界面的脚本应用
- 图形界面支持:PS2EXE 提供图形用户界面(GUI)功能,让开发者可以创建拥有图形界面的脚本应用程序,而无需深入学习开发桌面应用程序的复杂技术。适用于需要用户交互的场景,比如表单输入、数据展示等。
- 企业内部工具:对于内部使用的自动化工具或管理工具,开发者可以将 PowerShell 脚本转化为带 GUI 的可执行文件,使非技术人员也能够使用。
3. 自动化任务和批处理
- 批量处理脚本:很多 IT 管理员使用 PowerShell 脚本来自动化服务器管理、系统监控、数据备份等任务。通过 PS2EXE 编译成 .exe 文件,可以方便地在没有 PowerShell 环境的机器上执行这些自动化任务。
- 定期运行的脚本:如果需要将 PowerShell 脚本作为计划任务定期运行,使用 PS2EXE 可以将脚本编译成可执行文件,确保其能够独立运行,而不依赖于 PowerShell。
4. 分发 PowerShell 脚本的解决方案
- 保护脚本源码:通过将 PowerShell 脚本转换为可执行文件,能够减少源代码的暴露风险,尤其是当需要发布或分发脚本给客户或第三方时,编译后的可执行文件可以隐藏脚本的具体实现。
- 简化终端用户体验:如果你为客户或其他非技术人员开发了一个 PowerShell 脚本,通过将其转化为可执行文件,可以大大简化用户操作,只需运行 .exe 文件即可,无需了解 PowerShell 命令行的使用。
5. 开发独立的应用程序
- 轻量级应用程序开发:开发人员可以使用 PowerShell 来构建一些轻量级的桌面应用程序,尤其是在不需要完整桌面应用程序框架的情况下。例如,创建一些数据采集、日志分析、报告生成等小工具,通过 PS2EXE 转换为可执行文件后,成为一个完整的独立应用程序。
- 软件原型开发:PS2EXE 适合开发软件原型或小型工具,快速将 PowerShell 脚本转化为 Windows 可执行文件,快速展示一个概念或模型。
6. IT 运维和系统管理
- 系统配置与管理:IT 运维人员常常使用 PowerShell 脚本进行服务器管理、网络配置、自动化部署等。通过 PS2EXE,运维人员可以将这些脚本转化为可执行文件,方便在不同环境下执行,特别是在不同版本的 PowerShell 环境下执行。
- 无 PowerShell 环境的远程执行:如果远程系统没有安装 PowerShell 或者使用的是不同版本,PS2EXE 可以确保脚本可以独立执行,无需担心 PowerShell 环境的差异。
7. 安全性与合规性
- 封装与加密:通过将 PowerShell 脚本转化为 .exe 文件,可以减少脚本代码的暴露,有时也可以利用可执行文件的加密机制来保护脚本内容。这在一些对安全性要求较高的应用场景中尤为重要。
- 简化合规性管理:某些企业或组织要求所有内部工具都以可执行文件的形式运行,PS2EXE 可以帮助将 PowerShell 脚本转换为符合这些要求的格式。
总结:
PS2EXE 适用于任何需要将 PowerShell 脚本转化为独立可执行文件的场景,尤其是在需要避免依赖 PowerShell 环境、希望提供简洁用户体验或保护脚本源码的情况下。此外,它还非常适合开发带图形界面的桌面应用程序或工具,进一步拓宽了 PowerShell 脚本的使用场景。
Win-PS2EXE 参数的中文翻译和表格化:
参数 | 说明 |
---|---|
-inputFile <file_name> |
要转换为可执行文件的 PowerShell 脚本(文件必须为 UTF8 或 UTF16 编码) |
-outputFile <file_name> |
目标可执行文件名称或文件夹,默认为输入文件名,扩展名为 .exe |
-prepareDebug |
创建有助于调试的信息 |
-x86 或 -x64 |
仅为 32 位或 64 位运行时编译 |
-lcid <id> |
编译后的可执行文件的地区 ID,未指定时使用当前用户的文化设置 |
-STA 或 -MTA |
单线程公寓(STA) 或 多线程公寓(MTA) 模式 |
-noConsole |
生成的可执行文件将是一个没有控制台窗口的 Windows 窗体应用程序 |
-UNICODEEncoding |
在控制台模式下以 UNICODE 编码输出 |
-credentialGUI |
在控制台模式下使用 GUI 提示输入凭据 |
-iconFile <filename> |
编译后可执行文件的图标文件 |
-title <title> |
标题信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中) |
-description <description> |
描述信息(不显示,但嵌入在可执行文件中) |
-company <company> |
公司信息(不显示,但嵌入在可执行文件中) |
-product <product> |
产品信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中) |
-copyright <copyright> |
版权信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中) |
-trademark <trademark> |
商标信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中) |
-version <version> |
版本信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中) |
-configFile |
写入配置文件(<outputfile>.exe.config ) |
-noOutput |
生成的可执行文件将不生成标准输出(包括详细信息和信息通道) |
-noError |
生成的可执行文件将不生成错误输出(包括警告和调试通道) |
-noVisualStyles |
禁用为生成的 Windows GUI 应用程序启用的视觉样式(仅与 -noConsole 一起使用) |
-exitOnCancel |
在 Read-Host 输入框中选择“取消”或“X”时退出程序(仅与 -noConsole 一起使用) |
-DPIAware |
如果启用了显示缩放,则 GUI 控件将根据需要进行缩放(仅与 -noConsole 一起使用) |
-requireAdmin |
如果启用了 UAC,则编译后的可执行文件仅在提升的上下文中运行(如果需要,将出现 UAC 对话框) |
-supportOS |
使用最新 Windows 版本的功能(执行 [Environment]::OSVersion 可查看差异) |
-virtualize |
启用应用程序虚拟化(强制使用 x86 运行时) |
-longPaths |
如果操作系统启用了长路径(> 260 个字符),则启用长路径(仅适用于 Windows 10) |
生成的可执行文件有以下保留参数:
参数 | 说明 |
---|---|
-? [<MODIFIER>] |
获取嵌入在可执行文件中的 PowerShell 脚本帮助文本。可以使用可选的参数组合 -? -detailed 、-? -examples 或 -? -full 获取相应的帮助文本。 |
-debug |
强制调试可执行文件。它会调用 System.Diagnostics.Debugger.Launch() 。 |
-extract:<FILENAME> |
提取嵌入在可执行文件中的 PowerShell 脚本并将其保存为 FILENAME。脚本不会被执行。 |
-wait |
在脚本执行完毕后,显示“按任意键退出...”并等待按键。 |
-end |
所有后续选项将传递给可执行文件中的脚本。所有前面的选项将由可执行文件本身使用,并不会传递给脚本。 |
翻译成中文并表格化后的版本:
版本 | 日期 | 更新内容 |
---|---|---|
1.0.15 | 2025-01-05 | 如果只在 PowerShell Core 中使用,则无需在 PowerShell 5.1 中安装该模块 |
1.0.14 | 2024-09-15 | 新增参数 -? 用于已编译的可执行文件,显示原始 PowerShell 脚本的帮助信息 |
在 GUI 模式下,窗口标题为应用程序标题(如果在编译时设置了 -title 参数) |
||
1.0.13 | 2023-09-26 | 现在支持脚本目录名中使用 [ 和 ] |
源文件可以大于 16 MB(适用于需要的用户) | ||
新增 Win-PS2EXE 中的额外参数文本字段 | ||
1.0.12 | 2022-11-22 | 新增参数 -winFormsDPIAware ,在 noConsole 模式下支持 WinForms 缩放(仅适用于 Windows 10 或更高版本) |
1.0.11 | 2021-11-21 | 修复密码超过 24 个字符的错误 |
新增参数 -DPIAware ,在 noConsole 模式下支持缩放 |
||
新增参数 -exitOnCancel ,在输入框中选择取消时停止程序执行(仅适用于 noConsole 模式) |
||
1.0.10 | 2021-04-10 | 参数 outputFile 现在接受目标文件夹(不带文件名) |
1.0.9 | 2021-02-28 | 新增参数 UNICODEEncoding ,以 UNICODE 编码输出 |
将参数 debug 更名为 prepareDebug |
||
最终敢于使用高级参数 | ||
1.0.8 | 2020-10-24 | 重构 |
1.0.7 | 2020-08-21 | 修复了一个管道中多个进度条同时显示的 bug |
1.0.6 | 2020-08-10 | 选择提示现在像 PowerShell 一样工作(仅适用于控制台模式) |
支持 PowerShell Core(在后台启动 Windows PowerShell) | ||
修复了负参数值的处理 | ||
支持动画进度条(仅适用于 noConsole 模式) | ||
1.0.5 | 2020-07-11 | 支持嵌套进度条(仅适用于 noConsole 模式) |
1.0.4 | 2020-04-19 | 默认启用 Application.EnableVisualStyles() 用于 GUI 应用程序,新增参数 -noVisualStyles 以防止启用 |
1.0.3 | 2020-02-15 | 将文件从 UTF-16 转换为 UTF-8,以允许使用 git diff |
忽略控制键的安全字符串请求(仅适用于控制台模式) | ||
1.0.2 | 2020-01-08 | 将示例添加到 GitHub |
1.0.1 | 2019-12-16 | 修复了 ps2exe.ps1 和 Win-PS2EXE 中的“GUI 窗口无限宽度”问题 |
1.0.0 | 2019-11-08 | 第一个稳定版模块版本 |
0.0.0 | 2019-09-15 | 实验版 |