Windows

如何使用 powershell 中選擇的軟體包正確安裝 Cygwin?

  • July 1, 2018

我正在開發一個 Powershell 自動化腳本,該腳本在 Windows Server 機器上部署各種依賴項(作為從中創建 AMI 的準備),其中一個依賴項是 Cygwin,其中包含 Python、Curl 等各種包。

手動安裝帶有包的 Cygwin 是小菜一碟,您只需從安裝嚮導的一個步驟中提供的大量選擇中選擇它們。但是,對於腳本,這需要通過命令行來完成。

Cygwin 的常見問題解答指定了各種命令行參數,但我無法弄清楚:

  • 我應該使用哪些參數,例如是否--download需要
  • 最重要的是如何使用--packages參數指定包名稱

從 serverfault 上的其他文章中,我確實發現它是用逗號分隔的包名稱列表,但找不到工作範例或我可以使用的可接受包名稱列表。

對我來說,一個理想的解決方案是一種將我通過手動過程安裝的包“導出”或“遷移”到我可以執行的腳本的方法。

最終,我想出了一個對我有用的解決方案,並想分享我在任何地方都找不到的詳細解釋,希望它能在未來對像我這樣的人有所幫助。

第 1 步:在 Cygwin 中導出已安裝包的列表

要導出列表,請打開 Cygwin 並執行以下命令: cygcheck -c -d | sed -e "1,2d" -e "s/ .*$//" | awk 'NR==1{printf $0}{printf ",%s", $0}'

此命令由 3 個不同的應用程序組成cygchecksed並將awk結果從一個傳遞到下一個,因此讓我們將它們分解:

cygcheck是與 Cygwin 捆綁在一起的實用程序,用於驗證 Cygwin 部署。 cygcheck -c -d意思是:-c檢查包裹並-d只轉儲它們而不實際檢查它們是否正常。此命令生成正確包名稱及其版本的 ASCII 表。

sed是一個基於命令行的逐行文本編輯器,它在這裡清理輸入,因此-e "1,2d"刪除前 2 行(包含表頭)並-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 Mirrors 頁面中的任何鏡像,只需確保包含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;

引用自:https://serverfault.com/questions/919032