如何使用 powershell 中選擇的軟體包正確安裝 Cygwin?
我正在開發一個 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 個不同的應用程序組成
cygcheck
,sed
並將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;