Сценарий 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 для каждого?

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


person Benjamin Cuningham    schedule 08.01.2018    source источник


Ответы (6)


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

person postanote    schedule 08.01.2018
comment
У вас есть некоторые неправильные вещи, я начал редактировать вопрос, но при редактировании я бы удалил весь бит об управлении пакетами (или переместил его в нижнюю часть), поскольку это не относится к запросу OP. - person ferventcoder; 13.01.2018
comment
Я решил отредактировать, а не добавить другой ответ, так как этот вопрос был в основном правильным. Дух этого сообщества заключается в том, чтобы исправлять ошибки, и я этим и занимался. - person ferventcoder; 13.01.2018
comment
Я могу оговорить эти условия. - person postanote; 14.01.2018
comment
Я не уверен, что вы имели в виду, но вы не отменили мои изменения, так что, должно быть, все в порядке! : D - person ferventcoder; 15.01.2018

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

person Riddim    schedule 11.09.2018

На самом деле Microsoft работает над windows-dev-box -setup-scripts для этого с помощью boxstarter и шоколадный

Как проект с открытым исходным кодом вы можете его разветвить или загрузить и адаптировать под свои нужды.

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

person ddieppa    schedule 07.01.2019

Вот мой ответ с файлом, содержащим список пакетов:

#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
person Etienne Gautier    schedule 15.08.2019
comment
Но как запустить сценарий? - person Sebastian Nielsen; 14.07.2021

Позвольте мне объединить отличные идеи из postanote и Как запустить сценарий PowerShell

Содержание home_env_powershell_scr.ps1:

$Packages = 'googlechrome',
            'git'
 
If(Test-Path -Path "$env:ProgramData\Chocolatey") {
  # DoYourPackageInstallStuff
  ForEach ($PackageName in $Packages)
    {
        choco install $PackageName -y
    }
}
Else {
  # InstallChoco
  Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))      

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

Запустите этот скрипт в PowerShell (проверено в версии 5):

powershell -executionpolicy bypass -File C:\Users\mypath\home_env_powershell_scr.ps1
person klapshin    schedule 30.11.2020
comment
ForEach должен жить после закрытия If/Else, удалив это дублирование. Затем условие можно инвертировать, чтобы проверить, существует ли этот путь не, и установить choco для этого случая. Нет необходимости в else ветке. - person Alex Povel; 23.04.2021
comment
Ошибка: choco : The term 'choco' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At C:\Users\sebas\desktop\home_env_powershell_scr.ps1:14 char:2 + choco install $PackageName -y + ~~~~~ + CategoryInfo : ObjectNotFound: (choco:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException - person Sebastian Nielsen; 14.07.2021
comment
@SebastianNielsen выглядит так, будто choco не установлен должным образом: введите Powershell gcm choco. Если вы получили такое же сообщение, установите choco, следуя официальному руководству. - person klapshin; 16.07.2021

choco install --root
<==== $downloading from https://www.repository.mirror.its.co.id//
<===== loading package...
<==== installing..
<=== $installed

для установки шоколадного введите:

@@off
choco feature -on -n .fix.root
installing root...
chocoing...
username: mamas
password: patrakom
loginning...
<=============== downloading choco for windows from https://repository.its.ac.id//choco-installer
installing 7zip-10.45.3.11.0-x64.msi
adding repository from https://mirror.its.ac.id//
<- downloading login packages..]
password: patrakom
packing choco.nupkg
installing...
installed

когда открываете кучу шоколада из `mirror.its.hackerindonesia.or.id '

you about install linuxmint_64_xfce4.4_username_Torrent.iso.torrent 
username: mamasdanisy
password: patrakom123
settings: console
partion: chocolatey and c: drive.
are you add for repository this...
installing linux mint xfce...
booting....
saveing windows..
removing windows..
boot uefi booter from apt installer
linuxmint
installing linuxmint...
installed
linuxmint 34.03 lts 
selecting package.logs..
installing linuxmint...
building linuxmint package manually..
null-10-2-999-990 null null null null gawk-root
building linuxmint image...
builded..
installing linuxmint...
installed...
now you boot your choco install and login as mamas danisy and password for user mamas danisy is patrakom123
boot
linux 91.23 lts
[boot] starting service
[boot] starting pidgin with installing...
[boot] maintaining username....
[boot] logging in...
[boot] you are start avahi daemon [y/n] y-
[boot] starting avahi daemon...
[boot] starting linuxmint....
[boot] selecting torrent..
[boot] loading..
[boot] # linux settings [ok] # installing linuxmint [ok]
[boot] installing linuxmint...
[boot] installed.
linuxmint 92.40 text mode login
===============================
username: mamasdanisy
password: patrakom123
installed.
choco install wubi-discontinued
<==== downloading from https://repository.its.ac.id
<===== add link image for wubi manually enter command here: choco manual wubi-discontinued-eof <<echo-root <<echo-root <<installing root... build ubuntu images choco manual ubuntu images..
choco manual build ubuntu images
<======== downloading wubi.exe scripts...
building package wubi.exe from https://repository.its.ac.id//
<=========== installing c:/lib/nupkg/package.logs/wubi.exe/
<=========== packing c:/lib/nupkg/package.logs/wubi.exe/
<============ installing c:/nupkg/package.logs/wubi.exe
<============ installing wubi...
chocolatey has installed 1/1 package manually from repository.its.ac.id

`

person danisy sadiy danisy sadiy    schedule 27.04.2020