Powershell для установки нужной версии dotnetframework - PullRequest
1 голос
/ 24 февраля 2020

В моем клиенте нет Puppet, Chef или Choco, и я не могу установить их на его сервер для установки моего приложения.

  1. Проверить установленные версии do tnet framework.
  2. Конвертировать в '.' разделенная строка
  3. Преобразовать в System.Version (в некоторых есть 2 или 3 разделенных массива
  4. Сравнить с требуемой версией dotnetframework, например, 4.6.2
  5. Если установлена ​​более высокая версия, прервать
  6. Если нет, то установите MSI / EXE нужной версии фреймворка

Шаг 1: Проверьте версию tnet как System.Version:

Пока у меня есть :

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
  Get-ItemProperty -name Version, Release -EA 0 |
  Where-Object { $_.PSChildName -match 'Full'} |
  Select-Object Version

Но GetType, Split, Select-String просто не работают для меня.

Ошибки и код, которые до сих пор пробовали:

| Select-String $_

результаты in: Select-String: Невозможно привязать аргумент к параметру 'Pattern', поскольку он имеет значение null.

| {Select-String $_}

приводит к: Выражения допускаются только в качестве первого элемента конвейера.

|Select-Object $_.GetType

Не указывается тип версии

|Select-Object $_.Split(".")

приводит к следующему: Вы не можете вызвать метод для выражения с нулевым значением.

Редактировать: ответ @Theo хорош, теперь его можно переносить установка. net 4.6.2 logi c, что:

$SourceURI = "https://download.microsoft.com/download/F/9/4/F942F07D-F26F-4F30-B4E3-EBD54FABA377/NDP462-KB3151800-x86-x64-AllOS-ENU.exe"
$FileName = $SourceURI.Split('/')[-1]
$BinPath = Join-Path $env:TEMP -ChildPath "dotnet462\$FileName"
if (!(Test-Path $BinPath))
{
    Invoke-Webrequest -Uri $SourceURI -OutFile $BinPath
}
write-verbose "Executing $binpath /q /norestart"
Sleep 5
Start-Process -FilePath $BinPath -ArgumentList "/q /norestart" -Wait -NoNewWindow

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Я согласен с Мервальдом в приведении значений реестра к [Version] объектам, поэтому сравнение с минимальной версией станет простым.

Вместо того, чтобы сразу фильтровать по Full, я лично хотел бы сначала получить массив всех установленных версий и выберите из того, что мне нужно:

$minVersion = [version]'4.6.2'

$netVersions = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
               Get-ItemProperty -name Version, Release -ErrorAction SilentlyContinue |
               Select-Object @{Name = 'Version'; Expression = {[Version]$_.Version}}, 
                             @{Name = 'Type'; Expression = {$_.PSChildName}}

# display all installed version if you like
# $netVersions

# get the highest installed Full version
$highestVersion = $netVersions | Where-Object { $_.Type -match 'Full' } | Sort-Object | Select-Object -Last 1

# and compare that to the minimum function you need
if ($highestVersion.Version -lt $minVersion) {
    Write-Host "Installing .NET Framework $($minVersion.ToString())"
    # do the install here
}
else {
    Write-Host "Nothing to do here, client has version $($highestVersion.Version.ToString())"
}
0 голосов
/ 24 февраля 2020

Исходя из вашего вопроса, я полагаю, у вас проблемы с преобразованием полученной версии (из реестра). Если это так, вы можете сделать простое приведение типа:


> $versionObject = [System.Version]( Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
>>   Get-ItemProperty -name Version, Release -EA 0 |
>>   Where-Object { $_.PSChildName -match 'Full'} |
>>   Select-Object -ExpandProperty Version)

> $versionObject

Major  Minor  Build  Revision
-----  -----  -----  --------
4      8      4084   -1

После этого вы можете использовать $versionObject.Major, $versionObject.Minor, ... для дальнейшего сравнения.

Как видно, Я добавил -ExpandProperty к Select-Object, который возвращает строку. Затем строка передается через [System.Version] к соответствующему объекту.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...