用于安装Chocolatey的PowerShell脚本和包列表

Ben*_*ham 14 powershell chocolatey

我的目标是创建一个单一的脚本,我可以下载并在新的Windows版本上运行,以尽可能地设置系统.我要做的第一件事就是安装尽可能多的程序.我之前运行过这个(来自chocolatey.org)直接从PowerShell安装Chocolatey:

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Run Code Online (Sandbox Code Playgroud)

然后我跑了一堆choco install这样的:

choco install googlechrome -y
choco install git -y
choco install notepadplusplus -y
choco install sql-server-management-studio -y
Run Code Online (Sandbox Code Playgroud)

(我认为-y让它们在没有提示的情况下运行.)

该脚本应检查是否已安装Chocolatey,如果未安装,则运行安装脚本.然后它应该遍历一个包名列表并静默安装它们.

  • 如何检测是否已安装Chocolatey?
  • 如何根据该结果有条件地运行install命令?
  • 如何遍历包列表并choco install在每个包上运行命令?

如果您对如何使用其他方式实现我的主要目标有任何建议,请告诉我.

pos*_*ote 19

您可以通过查看PowerShell帮助文件和Microsoft技术文档来回答所有问题:

(Get-Command -Name Test-Path).Parameters
Get-help -Name Test-Path -Examples
Get-help -Name Test-Path -Full
Get-help -Name Test-Path -Online
Run Code Online (Sandbox Code Playgroud)

For 循环

(我认为-y让它们在没有提示的情况下运行.)

正确,它应该始终用于脚本.

该脚本应检查是否已安装Chocolatey,如果未安装,则运行安装脚本.然后它应该遍历一个包名列表并静默安装它们.

•如何检测是否已安装Chocolatey?

使用PowerShell快速查找已安装的软件

使用上面的链接 - 或者在安装时设置环境变量,默认ChocolateyInstall设置为C:\ProgramData\Chocolatey.

Test-Path -Path "$env:ProgramData\Chocolatey"
Run Code Online (Sandbox Code Playgroud)

一种更确定的方式可能是尝试

$ChocoInstalled = $false
if (Get-Command choco.exe -ErrorAction SilentlyContinue) {
    $ChocoInstalled = $true
}

# Do something with that for installation
Run Code Online (Sandbox Code Playgroud)

•如何根据该结果有条件地运行install命令?

使用if声明:

If(Test-Path -Path "$env:ProgramData\Chocolatey") {
    DoYourPackageInstallStuff}
Else {
    InstallChoco
    DoYourPackageInstallStuff
}
Run Code Online (Sandbox Code Playgroud)

•如何遍历包列表并在每个包上运行choco install命令?

使用for循环:

$Packages = 'googlechrome', 'git', 'notepadplusplus', 'sql-server-management-studio'

ForEach ($PackageName in $Packages)
{
    choco install $PackageName -y
}
Run Code Online (Sandbox Code Playgroud)

替代/增强

Microsoft有一个名为PackageManagement的内置包管理管理(内置于PowerShell v5中).您可以将它与ChocolateyGet提供程序一起使用(不要使用原型Chocolatey提供程序,它已损坏且存在安全问题)以管理第三方依赖项.

PackageManagement的优势在于它还具有用于管理PowerShell模块的PowerShellGet.

只需输入..

列出所有可用的模块/包

Find-Module

Find-Module -Name SomeSpecificModuleName(s)
Run Code Online (Sandbox Code Playgroud)

对于PowerShell版本3 - 4,您必须下载并安装PowerShellGet.

  • 你在这里有一些不正确的东西,我开始编辑这个问题,但在编辑中我会删除整个关于包管理的部分(或将它移到底部),因为它不适用于OP的请求. (2认同)
  • 我决定编辑而不是添加不同的答案,因为这个问题基本上是正确的。这个社区的精神是修复得合适,所以这就是我在这里所做的。 (2认同)

Rid*_*dim 5

我实际上制作了一个批处理脚本,它使用了巧克力本身的功能(配置文件)。你可以在这里查一下。只需更改配置文件中的包。


ddi*_*ppa 5

实际上,微软一直在开发windows-dev-box-setup-scripts来实现这一目标,使用boxstarterChocolatey

作为一个开源项目,您可以分叉或下载它并根据您的需要进行调整

希望能帮助到你 :)


Eti*_*ier 5

这是我的答案,其中包含一个包含软件包列表的文件:

#Requires -RunAsAdministrator

Set-ExecutionPolicy Bypass -Scope Process -Force

# install chocolatey if not installed
if (!(Test-Path -Path "$env:ProgramData\Chocolatey")) {
  Invoke-Expression((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}

# for each package in the list run install
Get-Content ".\packages" | ForEach-Object{($_ -split "\r\n")[0]} | ForEach-Object{choco install -y $_}
Run Code Online (Sandbox Code Playgroud)

假设该路径中有一个名为packages以下内​​容的文件:

googlechrome
git
notepadplusplus
sql-server-management-studio
Run Code Online (Sandbox Code Playgroud)