如何从一台机器获取软件包列表并在另一台机器上安装巧克力?

Nat*_*tan 20 chocolatey

调用clist -l给我一个包含版本的包列表:

7zip.install 16.04
ccleaner 5.28.6005
ConEmu 17.3.16.0
...
Run Code Online (Sandbox Code Playgroud)

如何在没有版本信息的情况下获取此列表?

我的目的是使用此输出来调用choco install 7zip.install ccleaner ConEmu ...另一台机器.另一种答案可能是如何clist直接使用输出cinst.

小智 28

导出功能终于实现了 -文档链接

除了官方版本之外,我不建议使用任何其他版本,但是,具有导出功能的分支可以在这里找到。

您可以在目录中运行build.bat并使用。然后你可以输入choco.exebuild_output

choco export -o="'c:\temp\packages.config'" --include-version-numbers --allowunofficial
Run Code Online (Sandbox Code Playgroud)

创建导出文件。

  • 现在这应该是公认的答案。导出是如此简单易用。 (2认同)

Gar*_*ark 18

如果您查看该choco install命令的帮助信息(您可以使用此命令chcco install -h,您将找到以下用法:

choco install chocolateygui

正如您将看到的,可以传递一个packages.config文件,该文件将包含您要安装的所有软件包.这个packages.config文件的格式非常简单,如下所示:

cinst <pkg|packages.config> [<pkg2> <pkgN>] [<options/switches>]
Run Code Online (Sandbox Code Playgroud)

获得此文件后,在另一台计算机上再次安装所有软件包是一个简单的单行命令.

生成这个packages.config文件的一种简单方法是安装ChocolateyGUI(choco install),其中包含一个导出当前安装的应用程序列表的选项.

  • @Natan有:`clist -l --idonly` (4认同)
  • 最终,这将是您可以运行以导出列表的命令。 (2认同)
  • 作为参考,导出命令似乎已基本准备就绪。https://github.com/chocolatey/choco/pull/1825 (2认同)

Ben*_*rds 16

这是我生成packages.config的方式:

$packageXml = ''
choco list -lo -r | % { $_ -split '\|' | select -first 1 } | % { $packageXml += "`n`t<package id=""$_"" />" }
Set-Content "<?xml version=`"1.0`" encoding=`"utf-8`"?>`n<packages>$packageXml`n</packages>" -Path .\packages.config
Run Code Online (Sandbox Code Playgroud)

一旦你有了它,你就可以将该文件带到另一台机器上并执行以下操作:

choco install packages.config
Run Code Online (Sandbox Code Playgroud)

  • 用 'id' 替换 'Id',否则 'choco install' 会抛出错误。 (3认同)

Jus*_*tin 8

这是我的穷人解决同一问题的解决方案,即将所有Chocolatey软件包放在一台计算机上,然后将它们安装在另一台计算机上,而不必担心特定版本(即我想要最新版本)。

  1. 使用ExportChocolately-GUI上的按钮将packages.config文件保存到共享的网络驱动器。
  2. 编辑该.config文件,然后version="X.Y.Z"从每一<package ... />行中删除字段。
  3. 在新机上运行choco install \\mypc\shared\packages.config -y

例如,我编辑的packages.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>
Run Code Online (Sandbox Code Playgroud)

PS .:不要犯同样的错误:我在Notepad ++中使用了一个简单的正则表达式来删除所有version="1.1.1"条目,并且无意中从第一<?xml ... ?>行中删除了相同的字段。这会破坏XML文件。比我要小心/聪明!

  • 这是删除版本的[快速、简单的方法](http://xsltransform.net/eiR19Uu)。只需粘贴您的 xml 和 . XSLT 终于派上用场了! (4认同)

J. *_*ian 6

我想总结一下这篇文章的其他答案给出的两种一般方法。

1. 导出一个简单的包名列表,并用它来构建一个cinst命令。

这与所问的问题一致:如何在clist -l没有版本信息的情况下。

我喜欢 的简单答案clist -l --idonly,但要自动执行此操作,仍然必须考虑第一行和最后一行。因此,可能需要一个简单的脚本——而在 Windows 上,这有点痛苦(这就是为什么甚至会问这个问题的原因)。

如果主要目标是备份和重新安装 Choclatey 软件包,那么有一些不错的选择,而无需编写自己的脚本。因此,下一种解决方案......

2.导出packages.config文件,cinst本地安装即可。

这是一个很好的方法,因为安装packages.config 是由cinst 本身支持的。
不幸的是,Chocolatey 缺乏对导出packages.config 的本地支持。

以下是几种常用的导出packages.config的方法:

有关此方法的背景以及跟踪内置解决方案的进度,请参阅https://github.com/chocolatey/choco/issues/357


小智 5

由于您想省略版本,因此我使用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
Run Code Online (Sandbox Code Playgroud)

正如Gary所建议的,配置文件可能是更易于维护的解决方案。我将我的配置存储在Web服务器上,因此我可以安装并执行一个命令来安装所有内容,并能够制作一个简单的XSL样式表进行查看。

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

或者,您可以将其保存在本地,然后使用所有信息进行调用:

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