Установить пакет Chocolatey, если программное обеспечение не установлено, но пропустить установку, если уже установлена ​​более новая версия программного обеспечения?

Я использую следующий сценарий PowerShell для установки dotnetcore-windowshosting версии 1.1.1 с помощью этапа развертывания Octopus.

ChocolateyPackageId равно "dotnetcore-windowshosting", а $ ChocolateyPackageVersion равно "1.1.1".

Однако на целевой машине установлена ​​новая версия DotNetCore.1.0.4_1.1.1-WindowsHosting.exe, чем версия, устанавливаемая пакетом Chocolatey. В результате возникает ошибка, предупреждающая меня о том, что на целевой машине уже установлена ​​более новая версия.

Как я могу установить пакет, используя cinst, как в сценарии, но игнорировать и не вызывать ошибку, если устанавливаемый пакет (или более новая версия) уже установлен?

$chocolateyBin = [Environment]::GetEnvironmentVariable("ChocolateyInstall", "Machine") + "\bin"
if(-not (Test-Path $chocolateyBin)) {
    Write-Output "Environment variable 'ChocolateyInstall' was not found in the system variables. Attempting to find it in the user variables..."
    $chocolateyBin = [Environment]::GetEnvironmentVariable("ChocolateyInstall", "User") + "\bin"
}

$cinst = "$chocolateyBin\cinst.exe"
$choco = "$chocolateyBin\choco.exe"

if (-not (Test-Path $cinst) -or -not (Test-Path $choco)) {
    throw "Chocolatey was not found at $chocolateyBin."
}

if (-not $ChocolateyPackageId) {
    throw "Please specify the ID of an application package to install."
}

$chocoVersion = & $choco --version
Write-Output "Running Chocolatey version $chocoVersion"

$chocoArgs = @()
if([System.Version]::Parse($chocoVersion) -ge
   [System.Version]::Parse("0.9.8.33")) {
    Write-Output "Adding --confirm to arguments passed to Chocolatey"
    $chocoArgs += @("-y", "")
}

if (-not $ChocolateyPackageVersion) {
    Write-Output "Installing package $ChocolateyPackageId from the Chocolatey package repository..."
    & $cinst $ChocolateyPackageId $($chocoArgs)
}
else {
    Write-Output "Installing package $ChocolateyPackageId version $ChocolateyPackageVersion from the Chocolatey package repository..." & $cinst $ChocolateyPackageId -Version $ChocolateyPackageVersion $($chocoArgs)
}

person PatrickNolan    schedule 27.11.2017    source источник
comment
Была ли установлена ​​более новая версия приложения через Chocolatey или вручную?   -  person Gary Ewan Park    schedule 28.11.2017
comment
Эй ... хотя я хотел бы сделать так, чтобы приложение всегда устанавливалось через Chocolatey, в реальном мире это просто невозможно. Так что да, это можно было установить вручную.   -  person PatrickNolan    schedule 28.11.2017
comment
Когда вы говорите, что во время установки произошла ошибка, можете ли вы точно подтвердить, что вы имеете в виду? Например, если он возвращается со стандартным кодом ошибки, возможно, сам пакет Chocolatey необходимо обновить, чтобы включить его в качестве допустимого кода выхода.   -  person Gary Ewan Park    schedule 28.11.2017
comment
Я получаю следующий вывод от powershell ... Сбои - dotnetcore-windowshosting (выход из 1638) - Ошибка при запуске 'C: \ ProgramData \ chocolatey \ lib \ dotnetcore-windowshostin g \ tools \ ChocolateyInstall.ps1'. См. Подробности в журнале. Журнал ошибок содержит следующее ... [2014: 2618] [2017-11-28T22: 58: 09] i199: Определение завершено, результат: 0x0 [2014: 3CF0] [2017-11-28T22: 58: 09] e000: ошибка 0x80070666: невозможно установить продукт, если установлена ​​более новая версия. [2014: 2618] [2017-11-28T22: 58: 09] i500: завершение работы, код выхода: 0x666   -  person PatrickNolan    schedule 28.11.2017
comment
Было бы интересно увидеть полный журнал. Кроме того, если вы запустите команду choco install с параметром -dv, вы получите более полную информацию. В идеале мы должны получить код выхода из попытки установки и вернуть его в validExitCodes для пакета.   -  person Gary Ewan Park    schedule 28.11.2017
comment
Привет, Гэри, у тебя есть адрес электронной почты, на который я могу отправить файлы журнала? Буду очень признателен за ваш отзыв. Я добавил код выхода, который я получаю, который составляет 1638, в validExitCodes, но ошибка по-прежнему отображается как ошибка (красный текст) в PowerShell.   -  person PatrickNolan    schedule 29.11.2017


Ответы (3)


Открытый источник

Продолжайте работу со сценарием, над которым вы работаете, однако проверьте код выхода того, что вы устанавливаете, он может иметь действительный код выхода, который указывает, что более новая версия уже установлена.

Коммерческий

Вероятно, лучший способ добиться того, что вы ищете, уже существует. В Chocolatey для бизнеса есть команда синхронизации и автоматическая синхронизация. https://chocolatey.org/docs/features-synchronize

Если вы запустили choco sync и затем вызвали свою установку, у вас уже будет более новая версия этого пакета, управляемая Chocolatey. Таким образом, он проигнорирует ваш сценарий.

choco sync
choco upgrade <name> -y <options>

Обновление здесь достигает установки, если пакет не установлен, и обновляется, если в ваших источниках есть более новая версия.

person ferventcoder    schedule 29.11.2017

Спасибо за все предложения. Ниже, похоже, работает для меня

$chocolateyBin = [Environment]::GetEnvironmentVariable("ChocolateyInstall", "Machine") + "\bin"
if(-not (Test-Path $chocolateyBin)) {
    Write-Output "Environment variable 'ChocolateyInstall' was not found in the system variables. Attempting to find it in the user variables..."
    $chocolateyBin = [Environment]::GetEnvironmentVariable("ChocolateyInstall", "User") + "\bin"
}

$cinst = "$chocolateyBin\cinst.exe"
$choco = "$chocolateyBin\choco.exe"

if (-not (Test-Path $cinst) -or -not (Test-Path $choco)) {
    throw "Chocolatey was not found at $chocolateyBin."
}

if (-not $ChocolateyPackageId) {
    throw "Please specify the ID of an application package to install."
}

$chocoVersion = & $choco --version
Write-Output "Running Chocolatey version $chocoVersion"

$chocoArgs = @()
if([System.Version]::Parse($chocoVersion) -ge [System.Version]::Parse("0.9.8.33")) {
    Write-Output "Adding --confirm to arguments passed to Chocolatey"
    $chocoArgs += @("-y", "")
}

if (-not $ChocolateyPackageVersion) {
    Write-Output "Installing package $ChocolateyPackageId from the Chocolatey package repository..."
    & $cinst $ChocolateyPackageId $($chocoArgs)
} else {
    Write-Output "Installing package $ChocolateyPackageId version $ChocolateyPackageVersion from the Chocolatey package repository..."
    & $cinst $ChocolateyPackageId -Version $ChocolateyPackageVersion $($chocoArgs) --force
}

$codes = $IgnoreExitCodes -split ','

if ($codes -Contains $lastExitCode)
{
    exit 0
}
person PatrickNolan    schedule 05.12.2017

Отказ от ответственности: это взломано. И не в лучшую сторону.

function Test-ChocolateyPackageInstalled {
    Param (
        [ValidateNotNullOrEmpty()]
        [string]
        $Package
    )

    Process {
        if (Test-Path -Path $env:ChocolateyInstall) {
            $packageInstalled = Test-Path -Path $env:ChocolateyInstall\lib\$Package
        }
        else {
            Write-Warning "Can't find a chocolatey install directory..."
        }

        return $packageInstalled
    }
}

$package = "dotnetcore-windowshosting"


if (Test-ChocolateyPackageInstalled -Package $package) {
    Write-Warning "Package is already installed"
}
else {
    choco install $package -confirm
}

Я когда-либо устанавливал это только через Chocolatey, поэтому мне будет сложно протестировать ваш сценарий, когда кто-то другой установил его вручную, но эта методология может иметь свои преимущества.

Поэтому также учтите, что это может не решить вашу проблему полностью; но это может помочь будущим читателям.

person gvee    schedule 28.11.2017
comment
Я не уверен, что это то же самое, о чем говорилось в OP - я уточнил заголовок, вы можете отредактировать свой ответ. - person ferventcoder; 02.12.2017