【问题标题】:Powershell to install desired dotnetframework versionPowershell 安装所需的 dotnetframework 版本
【发布时间】:2020-02-24 07:36:53
【问题描述】:

我的客户没有 Puppet、Chef 或 Choco,我无法在他的服务器上安装它们来安装我的应用程序。

  1. 检查已安装的 dotnet 框架版本。
  2. 转换为“.”分割字符串
  3. 转换为 System.Version(有些有 2 拆分或 3 拆分数组
  4. 与所需的 dotnetframework 版本进行比较,例如4.6.2
  5. 如果安装了更高版本,则中止
  6. 如果没有,则安装所需框架版本的 MSI/EXE

第 1 步:检查 dotnet 版本为 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 $_

导致:Select-String:无法将参数绑定到参数“模式”,因为它为空。

| {Select-String $_}

结果:表达式只允许作为管道的第一个元素。

|Select-Object $_.GetType

没有列出版本的类型

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

导致:您不能在空值表达式上调用方法。

编辑:@Theo 的回答很好,它现在可以包装安装 .net 4.6.2 逻辑,即:

$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

【问题讨论】:

  • 到底发生了什么?有错误吗?它说什么?返回了错误的数据?什么,期待什么?还有什么?
  • 并最终想做一些类似 Select-Object $_.Split(".")|选择对象 [System.Management.Automation.SemanticVersion]::New($_.[0],$_.[1],$_.[2],$_.[3])

标签: .net powershell dsc


【解决方案1】:

我同意 Moerwald 将注册表值转换为 [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())"
}

【讨论】:

    【解决方案2】:

    根据您的问题,我猜您在转换检索到的版本(来自注册表)时遇到了问题。如果是这样,您可以像这样进行简单的演员表:

    
    > $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] 将字符串转换为适当的对象。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2021-04-29
      • 1970-01-01
      • 2015-03-09
      • 2022-09-30
      • 2022-10-07
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      相关资源
      最近更新 更多