Сценарий PowerShell для установки Chocolatey и списка пакетов

Моя цель - создать один сценарий, который я могу загрузить и запустить в новой сборке Windows, чтобы как можно больше настроить систему. Первое, что я пытаюсь сделать, это установить как можно больше программ, которые мне всегда нравятся. Я ранее запускал это (это из chocolatey.org) для установки Chocolatey непосредственно из PowerShell:

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

Затем я запустил кучу choco install следующим образом:

choco install googlechrome -y
choco install git -y
choco install notepadplusplus -y
choco install sql-server-management-studio -y

(Я думаю, что -y заставляет их работать без подсказки.)

Сценарий должен проверить, установлен ли Chocolatey, а если нет, запустите скрипт установки. Затем он должен перебирать список имен пакетов и тихо устанавливать их.

  • Как определить, установлен ли Chocolatey?
  • Как я могу условно запустить команду установки на основе этого результата?
  • Как мне перебирать список пакетов и запускать команду choco install на каждом из них?

Если у вас есть предложения о том, как выполнить мою основную цель, используя другие средства, пожалуйста, дайте мне знать.

Ответ 1

На все ваши вопросы можно ответить, посмотрев файлы справки 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

For петель

(Я думаю, что -y заставляет их работать без подсказки.)

Правильно, и это всегда следует использовать в сценариях.

Скрипт должен проверить, установлен ли Chocolatey, и если нет, запустить скрипт установки. Затем он должен перебрать список имен пакетов и установить их без вывода сообщений.

• Как я могу определить, установлен ли Chocolatey?

Используйте PowerShell для быстрого поиска установленного программного обеспечения

Воспользуйтесь ссылкой выше - или при установке установлена переменная окружения ChocolateyInstall которая по умолчанию имеет значение C:\ProgramData\Chocolatey.

Test-Path -Path "$env:ProgramData\Chocolatey"

Более детерминированным способом может быть попытка

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

# Do something with that for installation

• Как я могу условно выполнить команду установки на основе этого результата?

Используя оператор if:

If(Test-Path -Path "$env:ProgramData\Chocolatey") {
    DoYourPackageInstallStuff}
Else {
    InstallChoco
    DoYourPackageInstallStuff
}

• Как мне просмотреть список пакетов и запустить команду choco install для каждого из них?

Используя цикл for:

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

ForEach ($PackageName in $Packages)
{
    choco install $PackageName -y
}

Альтернатива/Улучшение

Microsoft имеет встроенный менеджер менеджер пакетов под названием PackageManagement (встроенный в PowerShell v5). Вы можете использовать его с провайдером ChocolateyGet (не используйте прототип провайдера Chocolatey, он сломан и имеет проблемы с безопасностью) для управления сторонними зависимостями.

Преимущество PackageManagement состоит в том, что он также имеет PowerShellGet для управления модулями PowerShell.

Просто наберите..

Список всех доступных модулей/пакетов

Find-Module

Find-Module -Name SomeSpecificModuleName(s)

Для PowerShell версии 3-4 необходимо загрузить и установить PowerShellGet.

Ответ 2

Я на самом деле сделал пакетный скрипт, который использует функции самого шоколада (файлы конфигурации). Вы можете посмотреть его здесь. Просто измените пакеты в файлах конфигурации.

Ответ 3

На самом деле Microsoft работает над сценариями windows-dev-box-setup-scripts для достижения этого, используя boxstarter и chocolatey

Как проект с открытым исходным кодом вы можете раскошелиться или скачать его и адаптировать к вашим потребностям

Надеюсь, поможет :)

Ответ 4

@Riddim Я пытаюсь запустить ваш скрипт, однако при установке приложений по умолчанию я замечаю, что файлы не могут быть запущены с сетевого диска, их нужно скопировать на локальный компьютер: S

Попробовал даже изменить путь с% currentpath%\defaultapps.config на фактический путь

Ответ 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 $_}

При условии, что по этому пути находится файл с именем packages со следующим содержанием:

googlechrome
git
notepadplusplus
sql-server-management-studio