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

问题描述:

调用clist -l给我包与版本的列表:如何从一台机器上获取软件包列表并在另一台机器上安装巧克力?

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

我如何获得这个名单中,没有版本信息?

我的意图是使用此输出在另一台机器中调用choco install 7zip.install ccleaner ConEmu ...。一个替代答案可能是如何将clist的输出直接用于cinst

如果你看看为choco install命令的帮助(你可以做到这一点使用chcco install -h,你会发现下面的用法:

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

正如你所看到的,有可能。通过一个packages.config文件,其中将包含所有你想要安装的软件包此packages.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> 

一旦你^ h将这个文件重新安装到另一台机器上是一个简单的一行命令。

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

+1

最终,这将是您可以运行以导出列表的命令。 – ferventcoder

+1

@ferventcoder我希望有一个简单的clist -b,类似于dir/b,只有包名会出现。会让事情变得如此简单。 – Natan

既然你想省略的版本,我用的巧克力升级

#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 

由于加里建议配置文件可能是一个简单的解决方案,以维护。我服务器上的配置在网络服务器上,所以我可以在shell中执行一个命令来安装所有东西,并有能力制作一个简单的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 

的巧克力把它不提供该命令。这个问题(加上你提到的附加要求)只能用ETL解决方案来回答。没有命令来完成这个建议。

.ps1脚本可以正常工作。

也就是说,通过删除版本,您将跳到一些包到目标服务器上最新发布的版本。如果你需要安装的克隆,你也需要使用这些版本。

,我迟到了,但万一有人回来到这一点,这是我如何生成我packages.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 

这是我的穷人的解决同样的问题,即把所有的巧克力包放在一台机器上,并将它们安装在另一台机器上,而不用担心特定的版本(即我想要最新版本)。

  1. 使用上Chocolately的GUI的出口按钮来保存一个packages.config文件(到共享网络驱动器)
  2. 编辑该.config文件,并且从每个<package ... />线取出version="X.Y.Z"字段
  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> 

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