如何使用 powershell 中选择的包正确安装 Cygwin?

如何使用 powershell 中选择的包正确安装 Cygwin?

我正在编写一个 Powershell 自动化脚本,该脚本在 Windows Server 机上部署各种依赖项(作为从中创建 AMI 的准备),其中一个依赖项是 Cygwin,它包含各种包,例如 Python、Curl 等。

手动安装 Cygwin 及其软件包非常简单,您只需在安装向导的某个步骤中从大量可用选项中选择即可。但是,对于脚本,这需要通过命令行来完成。

Cygwin 的常见问题解答指定各种命令行参数,但我无法弄清楚:

  • 我到底应该使用哪些参数,例如是否--download需要
  • --packages最重要的是如何使用参数指定包名称

从 serverfault 上的其他帖子中,我确实发现它是一个用逗号分隔的包名称列表,但找不到可用的示例或可接受的包名称列表。

对我来说,理想的解决方案是将我通过手动过程安装的包“导出”或“迁移”到我可以运行的脚本中。

答案1

最终,我找到了一个适合自己的解决方案,并想分享我在任何地方都找不到的详细解释,希望它能够在将来帮助像我这样的人。

步骤 1:在 Cygwin 中导出已安装软件包的列表

要导出列表,请打开 Cygwin 并运行以下命令: cygcheck -c -d | sed -e "1,2d" -e "s/ .*$//" | awk 'NR==1{printf $0}{printf ",%s", $0}'

该命令由 3 个不同的应用程序组成,cygcheck并将sed结果awk从一个应用程序传输到另一个应用程序,让我们将它们分解一下:

cygcheck是与 Cygwin 捆绑在一起的实用程序,用于验证 Cygwin 部署。 cygcheck -c -d意思是:-c检查软件包并-d仅转储它们而不实际检查它们是否正常。此命令会生成正确软件包名称及其版本的 ASCII 表。

sed是一个基于命令行的逐行文本编辑器,它可以清理输入,因此-e "1,2d"会删除前两行(包含表头)并-e "s/ .*$//"删除空格和版本号,这样您就会得到一个仅包含包名称的列表。

最后awk是一种文本处理编程语言,在这里它有助于将列表打印为用逗号分隔的一行,因此NR==1{printf $0}只会打印第一行(第一个包名称),然后{printf ",&s", $0}打印,其前面的每个后续包名称。

结果是一行以逗号分隔的有效 Cygwin 包列表,可用于命令行安装程序。

步骤 2:使用命令行安装

我发现命令行安装需要的参数是:

  • --quiet-mode以无人值守模式安装
  • --root定义 Cygwin 应该安装在
    我选择的驱动器上的位置c:\cygwin64
  • --site定义要从中下载文件的镜像,
    我使用了http://cygwin.mirror.constant.com。您可以使用Cygwin 镜像页面,只需确保包含http://前缀!
  • --packages明确定义应该安装哪些软件包
    上一步创建的列表应该用双引号 ( ") 括起来,如下所示:--packages "pkg1,pkg2,pkg3"

其结果为以下命令格式: setup-x86_64.exe --quiet-mode --root c:\cygwin64 --site http://cygwin.mirror.constant.com --packages "curl,python,python-crypto"

步骤 3:作为 Powershell 脚本的一部分运行安装程序

在我的ps1脚本文件中,我曾经Start-Process运行 Cygwin 安装程序并等待它完成后再运行下一个命令。

最后一行代码如下: Start-Process "$PSScriptRoot\assets\setup-x86_64.exe" -ArgumentList "--quiet-mode --root C:\Cygwin64 --site http://cygwin.mirror.constant.com --packages `"curl,python,python-crypto`"" -Wait -NoNewWindow;

相关内容