web-dev-qa-db-ja.com

Chocolateyを使用して、あるマシンからパッケージのリストを取得し、別のマシンにインストールする方法は?

clist -lを呼び出すと、バージョンのパッケージのリストが表示されます。

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

バージョン情報なしでこのリストを取得するにはどうすればよいですか?

私の意図は、この出力を使用して別のマシンでchoco install 7Zip.install ccleaner ConEmu ...を呼び出すことです。別の答えは、clistの出力をcinstに直接使用する方法です。

25
Natan

choco installコマンドのヘルプ情報を見ると(chcco 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>

このファイルを入手したら、すべてのパッケージを別のマシンに再インストールするのは、単純な1行のコマンドです。

このpackages.configファイルを生成する簡単な方法は、現在インストールされているアプリケーションのリストをエクスポートするオプションを含むChocolateyGUI(choco install chocolateygui)をインストールすることです。

21
Gary Ewan Park

これは、同じ問題に対する私の貧乏人の解決策でした。つまり、特定のバージョンを心配することなく、1つのマシンにすべてのChocolateyパッケージを取得して別のマシンにインストールします(つまり、最新バージョンが必要です)。

  1. 使用 Export Chocolately-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>

PS .:私がしたのと同じ間違いをしないでください。私はNotepad ++で単純な正規表現を使用してすべてのversion="1.1.1"エントリを削除し、最初の<?xml ... ?>行から同じフィールドを誤って削除しました。これにより、XMLファイルが壊れます。私より注意深く/賢くしてください!

9
Justin

次に、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
7
Ben Richards

あなたがチョコアップグレードを使用したバージョンを省略したいので:

# 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サーバーで構成をサーバーに格納しているので、シェルで1つのコマンドを実行してすべてをインストールし、表示するための単純な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
5
Flightdeck73

この投稿に対する他の回答によって与えられた2つの一般的なアプローチをまとめたいと思います。

1。パッケージ名のプレーンリストをエクスポートし、それを使用してcinstコマンドを作成します。

これは、尋ねられた質問と一致しています:バージョン情報なしでclist -lする方法。

私はclist -l --idonlyの単純な答えが好きですが、これを自動化するには、最初と最後の行を考慮する必要があります。したがって、おそらく単純なスクリプトが必要です。Windowsでは、これは少し面倒です(そのため、この質問が尋ねられることもあります)。

Choclateyパッケージをバックアップして再インストールすることが主な目的である場合は、独自のスクリプトを作成せずにいくつかの良い選択肢があります。したがって、次のタイプのソリューション...

2。 cinstによってネイティブにインストールできるpackages.configファイルをエクスポートします。

Packages.configのインストールはcinstによってネイティブにサポートされているため、これは良い方法です。
残念ながら、Chocolateyには、packages.configをエクスポートするためのネイティブサポートがありません。

次に、packages.configをエクスポートする一般的な方法をいくつか示します。

このアプローチの背景、および組み込みソリューションの進行状況を追跡するには、 https://github.com/chocolatey/choco/issues/357 を参照してください。

2
J. Christian

Chocolateyはそのコマンドを提供していません。質問(およびあなたが言及した追加の要件)は、ETLソリューションでのみ回答できます。この提案を達成するためのコマンドはありません。

.ps1スクリプトは正常に機能します。

そうは言っても、バージョンを削除することで、一部のパッケージをターゲットサーバー上の最新の公開済みバージョンにジャンプすることになります。インストールのクローンが必要な場合は、バージョンも使用する必要があります。

1
Brent