如何从一台机器获取软件包列表并使用chocolatey安装在另一台机器上?

时间:2017-04-02 10:06:18

标签: chocolatey

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

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

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

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

7 个答案:

答案 0 :(得分:11)

如果您查看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>

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

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

答案 1 :(得分:4)

由于您要省略我使用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

正如Gary所说,配置文件可能是一个更容易维护的解决方案。我在Web服务器上为我的配置提供服务,因此我可以直接进入并执行一个命令来安装所有内容,并且能够制作一个简单的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

答案 2 :(得分:4)

我迟到了派对但是如果有人回到这里,这就是我生成packages.config的方式:

Row        6/30/2016    7/8/2016    7/14/2016   11/10/2016  11/17/2016
10                         2            1       
20             1           1                        1   
30                                                  1          2
40             1    

完成后,将该文件带到另一台机器上并执行:

create table etl_fb_site 
(FP_SITE number, ETL_LOAD_DATE date);

INSERT ALL
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (20  , TO_DATE('6/30/2016 20:05', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (40  , TO_DATE('6/30/2016 20:05', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (10  , TO_DATE('7/8/2016 10:03', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (20  , TO_DATE('7/8/2016 10:05', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (10  , TO_DATE('7/8/2016 10:10', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (10  , TO_DATE('7/14/2016 20:06', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (20  , TO_DATE('11/10/2016 21:18', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (30  , TO_DATE('11/10/2016 21:20', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (30  , TO_DATE('11/17/2016 20:33', 'mm/dd/yyyy hh24:mi'))
into etl_fb_site(FP_SITE,ETL_LOAD_DATE)values (30  , TO_DATE('11/17/2016 21:33', 'mm/dd/yyyy hh24:mi'))
select * from dual

答案 3 :(得分:2)

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

  1. 使用Chocolately-GUI上的 export 按钮保存packages.config文件(到共享网络驱动器)
  2. 编辑.config文件并从每个version="X.Y.Z"
  3. 中删除<package ... />字段
  4. 在新机器上运行choco install \\mypc\shared\packages.config -y
  5. 例如,我编辑的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文件。比我更小心/聪明!

答案 4 :(得分:1)

导出功能终于实现了?

我不建议使用官方版本以外的任何其他版本,但是具有导出功能的分支可用here

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

choco export -o packages.config --include-version-numbers --allowunofficial

创建导出文件。

答案 5 :(得分:0)

Chocolatey没有提供该命令。问题(加上您提到的其他要求)只能通过ETL解决方案来解答。没有命令来完成这个提议。

.ps1脚本可以正常工作。

话虽这么说,通过删除版本,您将把一些软件包跳到目标服务器上的最新发布版本。如果您需要克隆安装,您还需要使用这些版本。

答案 6 :(得分:0)

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

1。导出软件包名称的简单列表,并使用它来构建cinst命令。

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

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

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

2。导出packages.config文件,该文件可以由cinst本机安装。

这是一种不错的方法,因为cinst本机支持安装packages.config。
不幸的是,,Chocolatey缺少导出packages.config的本机支持。

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

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