Как получить список пакетов с одного компьютера и установить в другом с шоколадным?

Вызов clist -l дает мне список пакетов с версиями:

7zip.install 16.04
ccleaner 5.28.6005
ConEmu 17.3.16.0
...

Как получить этот список без информации о версии?

Я choco install 7zip.install ccleaner ConEmu... использовать этот вывод для вызова choco install 7zip.install ccleaner ConEmu... на другой машине. Альтернативный ответ может заключаться в том, как использовать вывод clist непосредственно в cinst.

Ответ 1

Если вы посмотрите на справочную информацию для команды choco install (вы можете сделать это с помощью chcco install -h, вы найдете следующее использование:

choco install <pkg|packages.config> [<pkg2> <pkgN>] [<options/switches>] cinst <pkg|packages.config> [<pkg2> <pkgN>] [<options/switches>]

Как вы увидите, можно передать файл package.config, который будет содержать все пакеты, которые вы хотите установить. Формат этого файла package.config очень прост и выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="calibre" version="2.81.0" />
  <package id="chocolatey" version="0.10.3" />
  <package id="chocolatey.extension" version="1.9.6" />
  <package id="chocolatey-core.extension" version="1.1.0" />
</packages>

После того, как у вас есть этот файл, установка всех пакетов снова на другом компьютере - это простая одна строка.

Простым способом создания этого файла package.config будет установка ChocolateyGUI (choco install chocolateygui), который включает опцию экспорта текущего установленного списка приложений.

Ответ 2

Поскольку вы хотите опустить версию, я использовал обновление choco:

# Filter for selecting packages, if empty will match all.
# I do this at times to see whats installed for my company packages
$PkgPrefix = ""

$cmd = "cup -y "
Test-WSMan $server | Out-Null
$session = New-PSSession -ComputerName $server -Credential ( Import-Clixml -Path $CredenitalFile ) -Verbose -Authentication Negotiate

$(clist -lo -r --id-starts-with "$PkgPrefix" )| % { $cmd += "$($_.Split( "|" )[0]),"}

Invoke-Command -Session $session -ScriptBlock $cmd

Как предположил Гэри, файл конфигурации может быть более простым решением для поддержки. Я настраиваю свои конфигурации на веб-сервере, так что я могу просто подключиться и выполнить одну команду, чтобы установить все и иметь возможность создать простую таблицу стилей XSL для просмотра.

cinst -y $( ( [xml]( Invoke-WebRequest -Uri http://softwareList.config) ).packages.package | Select id ).id

Или вы можете просто сохранить его локально и позвонить со всей информацией:

(iwr -Uri http://softwareList.config).content | Out-File "$($env:LOCALAPPDATA)\list.config" -Encoding utf8;
cinst "$($env:LOCALAPPDATA)\list.config -y

Ответ 3

Я опаздываю на вечеринку, но на случай, если кто-то вернется к этому, вот как я создал свой пакет.config:

$packageXml = ''
choco list -lo -r | % { $_ -split '\|' | select -first 1 } | % { $packageXml += "'n't<package Id=""$_"" />" }
Set-Content "<packages>$packageXml'n</packages>" .\packages.config

После этого вы перенесите этот файл на другой компьютер и выполните следующие действия:

choco install packages.config

Ответ 4

Это было решение моего бедного человека по той же проблеме, то есть взять все пакеты шоколада на одной машине и установить их на другой, не беспокоясь о конкретных версиях (то есть, мне нужны последние версии).

  1. Используйте кнопку export в Chocolately-GUI, чтобы сохранить файл package.config (на общий сетевой диск)
  2. Отредактируйте этот файл.config и удалите поля version="XYZ" из каждой строки <package.../>
  3. На новом компьютере запустите choco install \\mypc\shared\packages.config -y

Например, мой отредактированный файл package.config выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="audacity" />
  <package id="autohotkey" />
  <package id="autohotkey.install" />
  <package id="ccleaner" />
  <package id="chocolatey" />
  <package id="chocolatey-core.extension" />
  <package id="chocolateygui" />
</packages>

PS. Не делайте ту же ошибку: я использовал простое регулярное выражение в Notepad++, чтобы удалить все записи version="1.1.1" и случайно удалил одно и то же поле из первой строки <?xml...?>, Это разбивает файл XML. Будьте более осторожны/умнее меня!

Ответ 5

Chocolatey не предоставляет эту команду. На вопрос (плюс дополнительные требования, о которых вы упомянули) можно ответить только с помощью решения ETL. Там нет команды для выполнения этого предложения.

Скрипт.ps1 будет работать нормально.

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

Ответ 6

Я хотел бы обобщить два общих подхода, приведенных в других ответах на этот пост.

1. Экспортируйте простой список имен пакетов и используйте его для создания команды cinst.

Это согласуется с вопросом, который задавался: как clist -l без информации о версии.

Мне нравится простой ответ clist -l --idonly, но чтобы автоматизировать это, все равно нужно учитывать первую и последнюю строки. Итак, простой сценарий, вероятно, необходим - а в Windows это немного болезненно (именно поэтому этот вопрос даже задают).

Если основной целью является резервное копирование и переустановка пакетов Choclatey, то есть несколько хороших вариантов без написания собственных сценариев. Отсюда следующий тип решения...

2. Экспортируйте файл packages.config, который может быть установлен cinst изначально.

Это хороший способ сделать это, потому что установка package.config изначально поддерживается cinst.
К сожалению, у Chocolatey отсутствует встроенная поддержка экспорта package.config.

Вот несколько распространенных способов экспорта packages.config:

Для ознакомления с этим подходом и для отслеживания прогресса встроенного решения см. Https://github.com/chocolatey/choco/issues/357.