调用clist -l
会给我一个包含版本的软件包列表:
7zip.install 16.04
ccleaner 5.28.6005
ConEmu 17.3.16.0
...
如何在没有版本信息的情况下获取此列表?
我的目的是使用此输出在另一台机器中调用choco install 7zip.install ccleaner ConEmu ...
。另一种答案可能是如何将clist
的输出直接用于cinst
。
答案 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)
这是我的穷人解决同样问题的方法,即将所有巧克力包裹放在一台机器上并将其安装在另一台机器上,而不必担心特定版本(即我想要最新版本)。
version="X.Y.Z"
行<package ... />
字段
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文件。比我更小心/聪明!
答案 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。