【问题标题】:How to get a list of packages from one machine and install in another with Chocolatey?如何从一台机器上获取软件包列表并使用 Chocolatey 安装在另一台机器上?
【发布时间】:2017-04-02 10:06:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: chocolatey


    【解决方案1】:

    如果您查看choco install 命令的帮助信息(您可以使用choco install -h 进行此操作,您会发现以下用法:

    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),其中包括导出当前安装的应用程序列表的选项。

    【讨论】:

    • 最终这将是您可以运行以导出列表的命令。
    • @ferventcoder 我希望有一个简单的 clist -b,类似于 dir /b,只有包名会出现。会让事情变得简单得多。
    • @Natan 有:clist -l --idonly
    • 作为参考,export 命令似乎已经准备就绪。 github.com/chocolatey/choco/pull/1825
    【解决方案2】:

    这是我对同一问题的穷人解决方案,即在一台机器上获取所有 Chocolatey 包并将它们安装到另一台机器上,而不用担心特定版本(即我想要最新版本)。

    1. 使用 Chocolately-GUI 上的 Export 按钮保存 packages.config 文件(到共享网络驱动器)。
    2. 编辑该 .config 文件并从每个 &lt;package ... /&gt; 行中删除 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" 条目,并无意中从第一行 &lt;?xml ... ?&gt; 中删除了相同的字段。这会破坏 XML 文件。比我更小心/聪明!

    【讨论】:

    • 这里是 fast, easy way 删除版本。只需粘贴您的 xml 和?。 XSLT 终于派上用场了!
    【解决方案3】:

    这是我生成 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
    

    一旦你有了那个,你把那个文件带到另一台机器上然后做:

    choco install packages.config
    

    【讨论】:

    • 将 'Id' 替换为 'id',否则 'choco install' 会报错。
    • 另外我需要在Set-Content命令的路径前加一个-PathSet-Content "&lt;packages&gt;$packageXml`n&lt;/packages&gt;" -Path .\packages.config
    【解决方案4】:

    导出功能终于实现了-documentation link?

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

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

    choco export -o="'c:\temp\packages.config'" --include-version-numbers --allowunofficial
    

    创建导出文件。

    【讨论】:

    • 这现在应该是公认的答案。导出非常容易使用。
    【解决方案5】:

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

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

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

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

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

    2。导出一个packages.config文件,cinst可以原生安装。

    这是一个不错的方法,因为 cinst 原生支持安装 packages.config。
    不幸的是,Chocolatey 缺乏对导出 packages.config 的原生支持。

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

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

    【讨论】:

    • 不确定是什么时候添加的,但是--limit-output跳过了页眉和页脚行(并且还将包名和版本之间的分隔符更改为|管道字符),所以不需要过滤不再。感谢您的--id-onIy,我使用choco list --local-only --limit-output --id-only 列出已安装的软件包名称。更多选项github.com/chocolatey/choco/wiki/CommandsList
    【解决方案6】:

    由于你想省略我使用 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 所建议的,配置文件可能是一种更易于维护的解决方案。我在网络服务器上提供了我的配置,因此我只需执行一个命令即可安装所有内容,并能够制作一个简单的 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
    

    【讨论】:

      【解决方案7】:

      Chocolatey 不提供该命令。这个问题(加上你提到的额外要求)只能用 ETL 解决方案来回答。没有命令可以完成这个提议。

      .ps1 脚本可以正常工作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 2013-08-25
        • 1970-01-01
        • 2013-01-03
        • 2018-01-06
        • 2011-10-31
        • 1970-01-01
        相关资源
        最近更新 更多