我正在决定要使用哪种编程语言来编写一个简单的脚本,该脚本将发出 HTTP 请求检查是否有可用更新,如果有更新则下载更新并执行程序。在 MacOS 和所有 Linux 发行版上,我可以肯定地说系统上会有某个版本的 Python - 如果 Linux 发行版没有附带 Python,我可以肯定地假设这种小众操作系统的用户会知道如何安装它。
但是我知道 Windows 开箱即用,没有 python、jre,甚至没有用于运行 CLR 语言的运行时库。除了 Powershell 之外,还有其他什么可以使用吗?
该程序以 ZIP 文件的形式分发给 Windows,并且可移植(无需安装程序)。这就是我希望该语言已在用户的系统上可用的原因。
答案1
如果您可以发布已编译的程序,则不需要通用语言——您首先已经在编写程序了;使用相同的方法在主 App.exe 旁边编写 Updater.exe。例如,正如您所说,您编写 Lua 并将其与运行时捆绑在一起以生成 .exe 文件,因此您也可以执行相同操作以在 Lua 中创建更新程序。
至于内置程序,通常来说,PowerShell 是您的最佳选择。它运行在 .NET CLR 上,介于 Bash 和 C# 之间 - 该语言主要为“shell 脚本”类型的工作而构建,但您可以完全访问所有标准 .NET 类(以及 COM 和 WMI/CIM),如果Add-Type
您最终需要 FFI(P/Invoke),甚至可以使用内联 C# 代码。
有一个内置 HTTP 客户端Invoke-RestMethod
( irm
) 和一个略有不同的 HTTP 客户端Invoke-WebRequest
( iwr
);其中一个可以解析 JSON 和 XML。要显示消息,您可以使用以下方式调用 .NET WinForms:
[System.Windows.Forms.MessageBox]::Show("Hello!")
所有合理的较新的 Windows 版本都包含“Windows PowerShell”版本 5。它缺少一些细节,例如缺少一些 Invoke-WebRequest 选项,但除此之外几乎与现代 PowerShell 7 相同。
唯一的缺点是 PowerShell 脚本总是显示控制台窗口;到目前为止还没有等效pythonw.exe
或类似的功能。(这是一个很长的故事。
所有其他选项都稍微差一些:
- 使用 WinHTTP(或静态链接到 libcurl)编译的 .exe。您可以使用 Mingw64 从 Linux 编译 Windows .exe。
- VBScript。它现在已正式“弃用”,但由于诸如 之类的原因,它仍然随所有 Windows 版本一起提供
slmgr.vbs
。一些企业系统可能会禁用它,但他们同样可能禁用 PowerShell。 - 批处理脚本使用各种秘密将嵌入式二进制文件(例如 curl.exe)解压到 %TEMP% 中(如在一些不完全合法的工具中所见)。
curl.exe
使用 Windows 10 内置的批处理脚本。(我会使用 Nirsoft 的 nircmd.exe 来显示弹出消息,但没有什么可以阻止您echo
将 VBScript 放入 %TEMP% 或其他内容。)
答案2
可以指望存在于每个现代 Windows 版本中的唯一语言是:
Batch 是一种非常古老的语言,具有多种特性,但可以完成大多数工作(或多或少)。对于复杂的操作来说,使用它可能会非常痛苦。
PowerShell 更新很多,但其语法完全是新的(几乎每个问题都可以在互联网上找到示例)。它的学习难度更大,但可以执行很多操作,比 Batch 更广泛。某些操作需要从互联网安装其他模块,这可能会对分布式脚本产生负面影响。
VBScript 可能是人们更熟悉的语言,而且非常古老。微软希望它被弃用。但是,使用它编写的软件太多了,因此它似乎不太可能在未来几年内消失(或者永远不会消失)。
答案3
许多脚本语言都有办法将它们打包成单文件二进制可执行文件。
通常的策略是包含一个自定义解释器可执行文件,该文件从自身(将自身读取为源文件)和 zip 文件格式加载脚本。它之所以有效,是因为 zip 文件中的元数据存储在文件末尾,但可执行文件从文件开头加载。因此,可以简单地将任何可执行文件与任何 zip 文件合并为一个文件,使该文件既是有效的可执行文件又是有效的 zip 文件。所以现在您所需要的只是一个在加载脚本之前解压缩源文件的脚本解释器。
你提到了 Python。Python 有高温氧化剂可以将 Python 脚本“编译”为单个二进制可执行文件。我不是 Python 用户,所以我从未使用过它,但你可能想看看。
JavaScript 有几种打包二进制文件的方法。当然有电子VSCode 让它出名。还有韋斯特。当然,这两个都是针对 GUI 应用程序的,但对于命令行脚本,还有包。
答案4
如果我面临类似的挑战,我会选择一种可以轻松编译独立二进制文件的语言或运行时。对于更原生(机器级)的语言,我会尝试 Go(GoLang)。对于脚本,我会通过 Deno 使用 JavaScript/TypeScript。Go 可以跨许多操作系统进行编译。而且 Deno 有一个deno compile
命令可以将脚本捆绑成可移植的可执行文件。此外,这两种语言都有很棒的标准库。