你可以以许多不同的方式调用PowerShell脚本,但它们都有一个缺点,就是不能像标准的Windows程序(EXE)那样简单地运行它们。也许你想防止编辑脚本中的代码,或者让用户更容易地运行脚本。现在是时候学习如何将PS1转换为EXE了。
在本教程中,您将学习如何使用PS1到EXE生成器,您还将有机会对它们进行比较,以便决定哪一个最适合您的偏好。
要求
本教程演示了使用逐步说明将PS1转换为EXE的不同工具。确保您具备以下所有要求,以便跟随操作。
- A Windows computer with an administrator privileges
- 在Windows 7、8.1和10中,安装操作系统时已经包含了PowerShell。虽然一些脚本可以在PowerShell 3.0中运行,但最好还是获取PowerShell 5.1或PowerShell 7
- 将您的PowerShell执行策略 设置为允许脚本执行
PS2EXE
PS2EXE 实用工具是我们列表中的第一个工具。PS2EXE 是一个免费的、开源的 PowerShell 模块,根据作者 Ingo Karstein 的说法,“并不将 PowerShell 脚本转换为另一种语言。它是用 C# 编写的轻量级 PowerShell 主机封装了脚本,并将动态生成的 C# 源代码编译到内存中生成一个 EXE 文件。”
访问 Ingo Karstein 的 博客 了解更多有关 PS2EXE 起源的信息。该模块的开发在 2017 年左右停止了,但 Markus Scholtes 接管了 PS2EXE 的发展并创建了一个 GUI 版本。
安装 PS2EXE 模块
PS2EXE 最初是一个 PowerShell 脚本,当 Markus Scholtes 接管开发后,就提供了一个模块。由于 PS2EXE 使用该模块将您的脚本转换为可执行文件,因此您需要从 PowerShell Gallery 安装它。
按照以下说明安装 PS2EXE 模块。
- 以管理员身份打开 PowerShell 控制台。
2. 运行Install-Module
命令从PowerShell Gallery下载并安装模块
3. 当看到有关不受信任存储库的提示时,键入Y然后按Enter。别担心。这条消息是无害的。
通过命令行将PS1转换为EXE
PS2EXE提供了两种将PowerShell脚本转换为EXE的方式:命令行和GUI。让我们首先介绍如何使用命令行。
通过命令行将单个PowerShell脚本转换为EXE需要提供一行命令,该命令包括主要的PS2EXE命令(Invoke-PS2EXE
),然后是要转换的脚本路径和要创建的EXE的路径。
现在你可以运行target.exe,它会调用source.ps1脚本中定义的代码。如果在转换脚本时没有使用NoConsole
参数,运行target.exe文件时将会出现一个PowerShell控制台。
隐藏控制台
在前面的示例中,运行target.exe时,会出现一个典型的PowerShell控制台。大多数情况下,你不想看到这个。为了防止这种情况发生,可以在创建EXE时使用NoConsole
参数,如下所示。

你还可以选择仅为x86或x64运行时编译EXE和其他选项。你可以在GitHub发布页面上找到可用参数的列表。
通过PS2EXE-GUI工具将PS1转换为EXE
如果您不喜欢使用命令行,您也可以使用带有PS2EXE模块的图形用户界面(GUI)。稍晚些构建的GUI版本几乎提供与命令行版本相同的所有功能。
使用GUI版本的PS2EXE仅需点击几下即可将PS1转换为EXE。与命令行不同的是,您可以浏览并选择一个漂亮的文件资源管理器浏览对话框中的源文件(PS1)。
要运行GUI版本,您需要在计算机上安装.NET 4.x。如果您只安装了.NET 3.5x,则可以单独下载.NET 3.5x版本的PS2EXE-GUI。
假设您已经安装了上面提到的PS2EXE PowerShell模块,请打开文件资源管理器并导航到以下任一PS2EXE模块文件夹,并打开代表模块版本的文件夹。
Windows 32位:C:\Program Files (x86)\WindowsPowerShell\Modules\ps2exe\<version>
Windows 64位:C:\Program Files\WindowsPowerShell\Modules\ps2exe\<version>
在这些文件夹中,您会找到一个名为Win-PS2EXE.exe的文件。
- 打开C:\Program Files\WindowsPowerShell\Modules\ps2exe\<version>\Win-PS2EXE.exe工具。
2. 单击源文件框右侧的省略号,以定位要转换的PS1脚本。
3. 定义目标文件的值,并确保包含.exe文件扩展名。
4. 选择下面任何想要的转换定制。这只是一个参数的GUI表示,你可以像命令行版本一样在脚本中使用它。
5. 点击编译开始转换过程。

6. 当你点击编译按钮时,PS2EXE将打开一个PowerShell会话并执行转换。完成后,按下Enter键或关闭控制台窗口。

注意:使用PS2EXE编译的某些可执行文件可能会被您的杀毒软件检测为病毒。如果发生这种情况,请务必向您的杀毒软件供应商报告这些误报。
PS1转EXE
PS1到EXE是由F2KO Software开发的另一个免费桌面应用程序,可以将PS1文件转换为EXE文件。与PS2EXE不同,Ps1 to Exe是一个带有简单脚本编辑器的GUI工具。
就像PS2EXE一样,Ps1 to Exe也有GUI和命令行版本。然而,与PowerShell控制台不同,Ps1 to Exe要求您在命令提示符中运行命令。
不幸的是,尽管F2KO的网站仍然存在,但似乎无法从那里下载PS1到EXE。幸运的是,这个工具的可下载安装程序已经在互联网上流传。
让我们来看看如何运行和使用PS1到EXE来创建一个EXE文件从一个PowerShell脚本。
使用GUI转换PS1到EXE
安装和启动 Ps1 to Exe 后,您会注意到 PS1 to EXE 具有一个简单的脚本编辑器。在此脚本编辑器中,您可以构建和保存脚本,并单击按钮将它们转换。
Ps1 to Exe 支持点源;请注意下面的命令行是如何调用另一个 PS1 文件的。
使用 PS1 to EXE 将脚本转换为 EXE:
- 从桌面打开 PS1 to EXE 工具。
2. 单击 文件 ——> 打开,找到要转换的脚本并打开它。
一旦您打开了脚本,请配置您希望编译后的 EXE 运行的方式。屏幕右侧有一个面板,有三个选项卡可供探索。每个选项卡都有不同的配置选项供您选择。

3. 要添加依赖脚本,请单击 嵌入 选项卡,然后单击 添加。
4. 当满意于转换选项时,单击顶部工具栏上的 转换 按钮将脚本转换为 EXE。

使用命令行将 PS1 转换为 EXE
如果您更喜欢使用命令行,PS1 to EXE CLI 名为 ps1_to_exe.exe 但使用起来有点棘手。
在 PS1 to EXE 打开的情况下:
- 以管理员身份打开 命令提示符
2. 将工作目录更改为 PS1 to EXE 的安装文件夹。
3. 现在运行 ps1_to_exe 将 PS1 转换为可执行文件。
下面的命令还包括了在编译的EXE文件中包含一个依赖脚本,并将可执行文件的目标平台设置为64位Windows操作系统。
以下是实际转换过程及输出详情的演示。

IExpress 2.0
如果你不想再下载一个工具,那么你很幸运,因为你可以使用老式的IExpress工具。IExpress是一个内置的Windows应用程序,通常用于打包文件或创建软件安装程序。
它恰好可以在将依赖文件全部编译到一个可执行文件中的同时,也将PS1转换为EXE!
要将一个简单的PowerShell脚本转换为EXE:
- 你必须以管理员身份打开IExpress。按Windows键+R键打开运行对话框,输入iexpress然后按Ctrl+Shift+Enter键。

2. 在IExpress的欢迎页面上,选择创建新的自解压指令文件并点击下一步来配置你的包。这个自解压指令(SED)文件控制着构建安装包时使用的选项;可以将其看作是一个配置文件。

3. 选择提取文件并运行安装命令选项,然后单击下一步。如果您正在创建软件安装程序,此选项会提取您将包含在包中的文件。此选项还允许您编写自定义命令,在运行可执行文件时执行该脚本。

4. 现在提供一个包标题,然后单击下一步。包标题将出现在用户在安装过程中看到的所有提示上。
包标题仅适用于您创建软件安装程序的情况。在这种情况下,标题并不重要。

6. 接下来,选择无提示。选择无提示时,当用户运行EXE文件时不会出现不必要的对话框。

6. 如果您为需要最终用户许可协议(EULA)的项目创建包,则可以选择添加许可证以在运行EXE时显示。但是,为了进行演示,请选择不显示许可证选项,然后单击“下一步”。

7. 现在单击添加,然后浏览要包含在此EXE中的所有脚本。确保包括您打算调用的主要脚本以及脚本引用的任何依赖脚本和其他文件。

8. 在要启动的安装程序窗口上,使用文件
参数提供到powershell.exe引擎的路径。此外,请确保将ExecutionPolicy
参数设置为Bypass
,以确保任何预配置的执行策略不会阻止脚本执行。

9. 接下来,您可以定义当执行时EXE窗口的行为。如果EXE应在后台运行,请选择隐藏然后点击下一步。隐藏是最常见的窗口行为。

10. 由于您只是在后台运行EXE,所以不需要包含完成消息。选择无消息然后下一步。

11. 现在选择要创建的EXE的路径。在这里,您还可以启用一些不同的选项。完成后,点击下一步
- 隐藏用户文件提取进度动画 –如果您的EXE在后台运行,请保持此选项禁用。
- 在包内使用长文件名存储文件 – 在运行EXE时,支持提取过程中的长文件名。如果您将在Win 95上运行软件包并且在安装过程中将使用INF文件,则应将该选项保持禁用。

12. 如果您希望EXE在脚本完成后调用重新启动,则在这里可以选择始终重新启动。选择选项后,点击下一步。

13. 现在选择保存自解压缩指令(SED)文件并点击下一步。保存SED文件允许您在以后修改此向导中提供的任何选项。SED文件包含到目前为止提供的所有值的答案。

14. 现在只剩下编译软件包的步骤了。点击下一步,您将看到一个进程日志。要完成软件包的创建,请点击完成,然后您就完成了。
需要管理员权限运行
如果您有一个需要以管理员身份运行的脚本,IExpress 不提供这样的选项,但仍然是可能的。
在运行 IExpress 之前,复制下面的代码并粘贴到您的脚本顶部。此代码片段检查脚本是否以管理员身份运行。如果没有,它将关闭并以管理员权限自动重新运行脚本。
记住您需要根据运行时希望如何显示或隐藏 EXE 窗口更改WindowStyle
参数,该参数位于显示窗口屏幕上。
ISE Steroids
如果您喜欢在PowerShell ISE中编写脚本,这个工具适合您的风格。ISE Steroids 是 PowerShell ISE 编辑器的扩展,打包为一个 PowerShell 模块,添加了许多 ISE 功能。
ISE Steroids有许多功能,但你在这里需要的是其将脚本转换为EXE的能力,所以让我们深入了解吧。
- 假设你已经安装了ISE Steroids,请打开PowerShell ISE。
2. 在集成控制台中运行Start-Steroids
以运行扩展程序并加载Steroids。
3. 在编辑器窗口中打开或编写一个新脚本。本教程将使用这些文件。
4. 点击如下屏幕截图中的工具 —> 将代码转换为EXE选项。

5. 现在在小窗口中定义你想应用于生成的EXE的所有选项,就像下面的窗口一样。这些选项是参数,与PS2EXE的相同,用于配置EXE文件的属性和行为。

6. 一旦设置了所有选项,点击创建应用程序按钮。ISE Steroids将会要求你选择目标路径。之后,你就完成了将你的PS1文件转换为EXE的操作。
Visual Studio Code和PowerShell Pro Tools
对于我们接下来的编辑器,我们为你带来Visual Studio (VS) Code。VS Code是微软推荐的取代PowerShell ISE的编辑器,并被许多PowerShell开发人员所接受。
虽然VS Code没有原生的将PowerShell脚本转换为EXE的方法,但你仍然可以通过PowerShell Pro Tools扩展实现这一目标。除了将脚本转换为EXE之外,PowerShell Pro Tools扩展还帮助你打包脚本,包括GUI设计等功能。
PowerShell Pro Tools需要.NET 4.6.2(或更高版本)开发人员包和.NET Core 1.0或更高版本来打包脚本。
在这个演示中,你将使用Get-LatestAppLog3.ps1和AppLogsComplete.ps1。
假设你已经安装了VS Code和PowerShell Pro Tools扩展:
- 打开VS Code和要转换为EXE的PowerShell脚本。
2. 在VS Code右上角,点击将脚本打包为Exe按钮,如下所示。

3. 当您首次从脚本创建EXE时,PowerShell Pro Tools将在当前工作空间的根目录中创建一个package.psd1文件。

4. 在package.psd1文件中,脚本的确切路径将自动填充到Root键中以进行转换。定义输出路径键以指定保存EXE的路径,如下所示。

5. 当您从脚本创建EXE时,您会在屏幕底部的输出窗格中注意到各种日志消息。如果编译脚本时出现任何错误,您将在此处看到它们的显示。

编译相同EXE中的其他脚本
如果您的主脚本中调用了依赖脚本,则PowerShell Pro Tools扩展也可以处理这些脚本。为此,PowerShell Pro Tools要求您点源您希望包含在EXE中的任何脚本。
下面的Get-LatestAppLog3.ps1脚本是要编译的主脚本。在其中,它运行AppLogsComplete.ps1脚本。为确保PowerShell Pro Tools包含依赖的AppLogsComplete.ps1文件,您必须点源该脚本或将其带入当前脚本的范围。

一旦您已经加载了任何依赖脚本,请再次单击包脚本为Exe以开始将您的脚本转换为可执行文件。
PowerGUI
PowerGUI是最初的PowerShell脚本编辑器之一。尽管它似乎已经被人们长期遗忘,但您仍然可以在网络上找到副本。为什么要谈论一个早已被遗忘的PowerShell脚本编辑器呢?因为它内置了PS1到EXE的转换器!
尽管PowerGUI的网站不再存在,您仍然可以在诸如Softpedia之类的网站上找到一个 副本。
将PS1脚本编译为EXE
安装PowerGUI后,启动它,您将看到一个启动页面。要开始编译您的脚本,您可以从工具栏创建一个新脚本,或者打开一个现有的脚本,就像下面的截图所示。

一旦您对您的脚本满意,单击工具菜单。然后选择编译脚本或按键盘上的Ctrl+F9。

现在,配置您希望转换后EXE运行的方式。如下所示,编译脚本窗口包含您可以为EXE的行为选择的不同选项。
- 单击浏览按钮,找到您要转换的PS1文件。
2. PowerGUI支持来自Microsoft .NET Framework 3.5到.NET Framework 4.0的目标框架。
3. 如果你只想让EXE在后台运行,可以禁用执行脚本时显示PowerShell控制台窗口选项。
4. 如果有其他文件需要包含,你也可以点击(左下角的)依赖项按钮。通常情况下,这些文件是你的脚本依赖的其他PowerShell脚本。
5. 一旦配置完成,点击确定开始将你的PS1转换为EXE。

另外,需要注意的是,使用PowerGUI控制EXE运行方式时会有一些不足之处。PowerGUI并没有提供太多选项,比如添加参数等。
此外,与其他PS1转EXE工具不同,PowerGUI也没有提供嵌入版权、版本和描述等信息的选项。但如果这些对你影响不大,那么PowerGUI还是一个不错的选择。
PowerShell Studio
PS1转EXE工具列表的最后,我们介绍一款功能丰富的PowerShell集成开发环境,那就是Sapien Technologies的PowerShell Studio。作为专门为PowerShell打造的IDE,仅仅展示它将PS1转换为EXE的能力并不能充分展现PowerShell Studio的价值。不过,我们的空间有限,无法详细展示其所有功能!
就像在Visual Studio Code中的PowerShell Pro Tools一样,PowerShell Studio对于打包脚本也有严格的要求;例如.NET Framework 4.8,PowerShell 7所需的.NET 5和Visual Studio 2015-2019运行时
假设您已经安装了PowerShell Studio,请打开PowerShell Studio并创建或打开现有的PowerShell脚本。本教程将使用Get-LatestAppLog3.ps1脚本。
导航设置
在转换PowerShell Studio中的脚本之前,您应该首先了解可以更改生成的EXE文件行为的众多方法。
单击窗口右上角的Package按钮,然后选择Settings。这将打开脚本打包器窗口,您可以在其中定义所有可用的选项。

脚本打包器中的每个选项都在您想要的EXE文件输出的外观方面起着重要作用。这些选项在以下部分中将通过屏幕截图进行演示。
脚本引擎
脚本引擎部分侧重于目标平台和用于编译可执行文件的脚本引擎。
开始选择您的目标。您可以选择 Windows 的 32 位或 64 位版本,或者您也可以选择两者以获得灵活性。PowerShell Studio 将为您选择的每个平台创建一个 EXE 文件。

输出设置
此部分包含配置编译后的 EXE 文件的选项。
- 输出文件 – 结果 EXE 的名称。
请不要包含文件扩展名 (.exe),因为它将自动设置到该字段中。
- 输出文件夹 – PowerShell Studio 将保存可执行文件的位置。
- 解析并包含外部脚本 – 如果您的主脚本中有依赖脚本,请确保选中此选项。如果您不启用此选项,则在编译可执行文件时将忽略外部脚本。
始终确保任何依赖脚本与主脚本位于同一文件夹中。
- 签名 – 您可以在此处搜索一个证书,以便为 EXE 签名,以及证书的密码(如果有的话)。

图标文件
图标有助于您区分不同的应用程序,而图标文件部分为您提供了为可执行文件添加图标的选项。
要添加图标文件,请单击“添加文件”按钮,或直接将图标文件拖放到图标文件部分。

限制
在限制部分,您可以包含或排除标准以允许EXE执行。
在此字段中检查操作系统将确保生成的EXE仅在该操作系统上执行。同样,您可以定义标准,如必须登录特定用户,计算机必须具有特定的MAC地址等。
如下所示,您可以完全控制生成的EXE何时执行。

版本信息
当PowerShell Studio创建EXE时,该EXE具有各种文件属性。在版本信息部分,您可以定义这些属性的外观。
在这里,您可以设置文件版本、产品版本、版权等属性。您可以在下面看到所有可用的属性。

构建选项
最后,您将找到构建选项部分。在此部分,您可以添加自定义的预构建或后构建命令以执行。此选项将在将脚本编译为可执行文件之前或之后执行PowerShell命令。
假设您想在PowerShell Studio完成创建EXE后运行一些代码。要执行此操作,请单击新建(插入)按钮在后构建命令框中。预构建和后构建命令都直接接受PowerShell命令。
或者,您可以单击添加文件(省略号)按钮并选择另一个应用程序或要运行的PowerShell脚本。

在设置好一切之后,点击 确定 将脚本打包成可执行文件。文件的位置将自动打开,以便您检查可执行文件。
考虑外部 PowerShell 脚本依赖性
A PowerShell script sometimes isn’t a self-contained unit. A script can also call other scripts. When converting to an EXE, some of the tools discussed here do not automatically find these dependent scripts and compile them.
当脚本包含对另一个脚本的引用,并且该脚本转换为 EXE 时,路径可能会发生变化。当这种情况发生时,EXE 中的 PowerShell 代码无法找到依赖的脚本,从而导致失败。
也许您有一个脚本希望转换,该脚本调用同一文件夹中的其他脚本。当通过 PowerShell 控制台运行脚本时,它可以找到这些脚本,因为它们都在同一个工作目录中。但是,将脚本转换为 EXE 可能会破坏这种情况。
如果您打算将 PS1 转换为 EXE,并且该脚本调用同一目录中的其他脚本,请在您的脚本顶部添加以下代码片段。
下面的代码片段解析了从主脚本运行的外部脚本的路径,只要它们都在同一个目录中。
功能比较
如果您还没有决定如何从 PowerShell 脚本创建 EXE,可以看看下面的表格。该表格提供了每个工具特性的概览,以帮助您决定哪个工具是您的 PS1 到 EXE 转换器的选择。
