如何从PowerShell脚本创建一个可执行的.exe文件?

37

能否从PowerShell脚本创建可执行的 file.exe文件?

8个回答

21
不行。至少目前为止不行,经过 PowerShell 的五个版本之后,似乎永远都不可能实现。
我希望只说到这里就好了,但是其他人已经提供了一堆“变通”类型的答案,我感觉有必要做出回应:
可以将你的 .ps1 脚本包装进另一种脚本类型中,使其可双击运行,甚至可以生成一个包含脚本的可执行文件(请参见此线程上的其他答案)...... 但是这些“可执行文件”需要系统中已经安装了正确的 PowerShell 版本,因此做这件事没有任何优势,并且会失去 PowerShell 的许多功能(例如流对象输出、帮助文档以及自动参数处理和用户的 Tab 完成)。
这是一个简单的 .cmd 批处理文件包装器(你可以扩展它以允许参数):
REM <#
copy %0 %0.ps1
PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Command "&{Set-Alias REM Write-Host; .\%0.ps1}"
del %0.ps1
exit
REM #>

### Your PowerShell script goes below here.
### I've put a couple of lines as an example ...
ls | sort length -desc | select -first 5 | ft
ps | sort ws -desc | select -first 10 | ft

我知道如何在Windows上将PowerShell脚本打包成可执行文件

通过使用Portable PowerShell,可以将正确版本的PowerShell和脚本封装到一种类似于自解压缩zip文件的东西中并使其工作。这不是任何正常意义下的可执行文件 - 这有点像如果Valve决定只将vmware映像作为Linux用户玩《半条命》的解决方案之一。但该产品似乎已经被放弃了。

使用PrimalScript(或PowerShell Studio)或PowerGuipShellExec,您的脚本可以被加密,因此它稍微安全一些以免被窥探……但这基本上只是混淆,并且在某些方面更糟糕,本质上和批处理文件没有什么区别。


使用C语言的类似解决方案是 `#include <stdlib.h>int main(void) { system("powershell -ExecutionPolicy ByPass -File nameOfScript.ps1"); }` - Mark

8

是的,使用PS2EXE可以创建*.exe文件。

用法

整个过程非常简单,而且已经很好地解释了,但是这里有一段代码片段:

C:\Scripts\PS2EXE\PS2EXE_0.5.0.0.0\ps2exe.ps1 
    -inputFile  C:\Scripts\ExampleEXE\example.ps1 
    -outputFile C:\Scripts\ExampleEXE\example.exe -sta -noConsole -runtime40 -verbose -x64

唯一的不好之处是该项目已经被淘汰。自2015年以来没有更新或新版本。

编辑: 该项目已由新的人接手并得到维护。您可以在此处找到更新的代码,截至本次编辑日期01/04/2018。 https://gallery.technet.microsoft.com/scriptcenter/PS2EXE-GUI-Convert-e7cb69d5


版本信息

要添加和编辑版本信息,请使用类似VERPATCH的工具。


更新2019

向名为PythonEXE的git仓库致敬。

它演示了如何从Python项目创建可执行文件,并提供了一个YouTube逐步指南。


3
我尝试了这个,但它一直显示未知版本的PowerShell。 - Mark

8

使用PowerGUI的脚本编辑器(它是免费的并且可用)。在PowerGUI脚本编辑器中打开您的脚本 > 工具 > 编译脚本 > 选择您想要的任何选项以生成 .exe 文件(密码保护源代码,在 .exe 运行后自动关闭控制台等)。


这也是 PowerShell.org 的专家建议。非常简单。 - ruffin
非常好用!谢谢! - SNag
1
链接已失效。目前可以在此处下载 PowerGUI:http://www.softpedia.com/get/Programming/File-Editors/Quest-PowerGUI.shtml - James
我是PowerGUI的忠实粉丝(也是经验丰富的用户),我可以看出这个解决方案对于简单情境运作良好。然而,当PS代码涉及到本地路径(比如寻找配置文件或执行日志文件夹)时,它会出现问题。这个缺陷可以被解决,但你需要意识到它。 - Piotr L
1
虽然PowerGUI已经停止更新,但是它通过Chocolatey得以继续存在!有两种方法可以实现,一种是在这里使用Chocolatey(https://chocolatey.org/packages/PowerGUI),另一种是查看评论以获取Windows Live用户提供的直接链接。 - ZaxLofful

8

开箱即用 - 不行。但我编写了一个PowerShell脚本,可以将脚本包装成EXE文件。我早些时候创建了这个脚本,但决定在这里博客分享给大家。


你好 Keith,Skydrive 不让我登录,说它“不适用于我的浏览器”,你能否上传一个 .zip 文件或在 pastebin / poshcode 上创建一个镜像。提前感谢你。 - Knuckle-Dragger

7

我理解你的问题是“我的PowerShell脚本能生成可执行文件吗?”这正是我在寻找答案时看到这篇文章时尝试去做的。使用Add-Type命令可以实现这个目标。

Add-Type -TypeDefinition @"
    using System;
    class Program {
        public static void Main(string[] args) { 
            Console.WriteLine("Hello World!");
        }
    }
"@ -CompilerParameters @{
    "GenerateExecutable" = $true
    "OutputAssembly" = "test2.exe"
}

更多信息请参考:https://devblogs.microsoft.com/powershell/how-to-write-a-console-application-in-powershell-with-add-type/ - noseratio - open to work
谢谢你的回答 <3 - tbhaxor
我本来想自己发布这个,因为知道有人可能在寻找它。 :) - flarn2006

3
我发现将PowerShell脚本打包成exe文件最好的解决方案是将其包装在NSIS可执行文件中。
我编写了一个.nsi脚本,类似于以下内容:
Name "Maintenance task"
OutFile "maintenance.exe"
ShowInstDetails show

Section "Main"
  ;Executes the "script-to-run.ps1" PowerShell script
  InitPluginsDir
  SetOutPath "$pluginsdir\MyOrg" ;It is better to put stuff in $pluginsdir, $temp is shared
  ;extract the .ps1 and run it, collecting output into details.
  File script-to-run.ps1
  nsExec::ExecToLog 'powershell  -inputformat none -ExecutionPolicy RemoteSigned -File "$pluginsdir\MyOrg\script-to-run.ps1"  '
  SetOutPath $exedir
SectionEnd

我只需要使用NSIS工具链将脚本编译为exe,它将在任何安装了PowerShell的操作系统上运行,无论执行策略是什么。
这受到了这个问题如何在NSIS中调用PowerShell的启发。

2

PrimalScript 是由Sapien开发的一款工具,可以将 PowerShell 脚本生成可执行文件。需要注意的是,运行生成的可执行文件所在的机器必须安装 PowerShell。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接