diff --git a/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 b/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 index a6bdfd8ab3..59a0c3caba 100644 --- a/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 +++ b/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 @@ -100,7 +100,7 @@ function Initialize-Chocolatey { This will initialize the Chocolatey tool by a) setting up the "chocolateyPath" (the location where all chocolatey nuget packages will be installed) b) Installs chocolatey into the "chocolateyPath" - c) Installs .net 4.0 if needed + c) Installs .net 4.8 if needed d) Adds Chocolatey to the PATH environment variable so you have access to the choco commands. .PARAMETER ChocolateyPath Allows you to override the default path of (C:\ProgramData\chocolatey\) by specifying a directory chocolatey will install nuget packages. @@ -124,6 +124,8 @@ param( $installModule = Join-Path $thisScriptFolder 'chocolateyInstall\helpers\chocolateyInstaller.psm1' Import-Module $installModule -Force + Install-DotNet48IfMissing + if ($chocolateyPath -eq '') { $programData = [Environment]::GetFolderPath("CommonApplicationData") $chocolateyPath = Join-Path "$programData" 'chocolatey' @@ -195,7 +197,6 @@ Creating Chocolatey folders if they do not already exist. } Add-ChocolateyProfile - Install-DotNet4IfMissing Invoke-Chocolatey-Initial if ($env:ChocolateyExitCode -eq $null -or $env:ChocolateyExitCode -eq '') { $env:ChocolateyExitCode = 0 @@ -735,58 +736,59 @@ if (Test-Path($ChocolateyProfile)) { } } -$netFx4InstallTries = 0 +$netFx48InstallTries = 0 -function Install-DotNet4IfMissing { +function Install-DotNet48IfMissing { param( $forceFxInstall = $false ) # we can't take advantage of any chocolatey module functions, because they - # haven't been unpacked because they require .NET Framework 4.0 + # haven't been unpacked because they require .NET Framework 4.8 - Write-Debug "Install-DotNet4IfMissing called with `$forceFxInstall=$forceFxInstall" + Write-Debug "Install-DotNet48IfMissing called with `$forceFxInstall=$forceFxInstall" $NetFxArch = "Framework" if ([IntPtr]::Size -eq 8) {$NetFxArch="Framework64" } - $NetFx4ClientUrl = 'https://download.microsoft.com/download/5/6/2/562A10F9-C9F4-4313-A044-9C94E0A8FAC8/dotNetFx40_Client_x86_x64.exe' - $NetFx4FullUrl = 'https://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe' - $NetFx4Url = $NetFx4FullUrl - $NetFx4Path = "$tempDir" - $NetFx4InstallerFile = 'dotNetFx40_Full_x86_x64.exe' - $NetFx4Installer = Join-Path $NetFx4Path $NetFx4InstallerFile - - if ((!(Test-Path "$env:SystemRoot\Microsoft.Net\$NetFxArch\v4.0.30319") -and !(Test-Path "C:\Windows\Microsoft.Net\$NetFxArch\v4.0.30319")) -or $forceFxInstall) { - Write-Output "'$env:SystemRoot\Microsoft.Net\$NetFxArch\v4.0.30319' was not found or this is forced" - if (!(Test-Path $NetFx4Path)) { - Write-Output "Creating folder `'$NetFx4Path`'" - $null = New-Item -Path "$NetFx4Path" -ItemType Directory + $NetFx48Url = 'https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe' + $NetFx48Path = "$tempDir" + $NetFx48InstallerFile = 'ndp48-x86-x64-allos-enu.exe' + $NetFx48Installer = Join-Path $NetFx48Path $NetFx48InstallerFile + + if (((Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" -ErrorAction SilentlyContinue).Release -lt 528040) -or $forceFxInstall) { + Write-Output "The registry key for .Net 4.8 was not found or this is forced" + + if (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending") { + Write-Warning "A reboot is required. `n If you encounter errors, reboot the system and attempt the operation again" } - $netFx4InstallTries += 1 + $netFx48InstallTries += 1 - if (!(Test-Path $NetFx4Installer)) { - Write-Output "Downloading `'$NetFx4Url`' to `'$NetFx4Installer`' - the installer is 40+ MBs, so this could take a while on a slow connection." - (New-Object Net.WebClient).DownloadFile("$NetFx4Url","$NetFx4Installer") + if (!(Test-Path $NetFx48Installer)) { + Write-Output "Downloading `'$NetFx48Url`' to `'$NetFx48Installer`' - the installer is 100+ MBs, so this could take a while on a slow connection." + (New-Object Net.WebClient).DownloadFile("$NetFx48Url","$NetFx48Installer") } $psi = New-Object System.Diagnostics.ProcessStartInfo - $psi.WorkingDirectory = "$NetFx4Path" - $psi.FileName = "$NetFx4InstallerFile" + $psi.WorkingDirectory = "$NetFx48Path" + $psi.FileName = "$NetFx48InstallerFile" # https://msdn.microsoft.com/library/ee942965(v=VS.100).aspx#command_line_options # http://blogs.msdn.com/b/astebner/archive/2010/05/12/10011664.aspx # For the actual setup.exe (if you want to unpack first) - /repair /x86 /x64 /ia64 /parameterfolder Client /q /norestart - $psi.Arguments = "/q /norestart /repair" + $psi.Arguments = "/q /norestart" - Write-Output "Installing `'$NetFx4Installer`' - this may take awhile with no output." + Write-Output "Installing `'$NetFx48Installer`' - this may take awhile with no output." $s = [System.Diagnostics.Process]::Start($psi); $s.WaitForExit(); - if ($s.ExitCode -ne 0 -and $s.ExitCode -ne 3010) { - if ($netFx4InstallTries -ge 2) { + if ($s.ExitCode -eq 1641 -or $s.ExitCode -eq 3010) { + throw ".NET Framework 4.8 was installed, but a reboot is required. `n Please reboot the system and try to install/upgrade Chocolatey again." + } + if ($s.ExitCode -ne 0) { + if ($netFx48InstallTries -ge 2) { Write-ChocolateyError ".NET Framework install failed with exit code `'$($s.ExitCode)`'. `n This will cause the rest of the install to fail." - throw "Error installing .NET Framework 4.0 (exit code $($s.ExitCode)). `n Please install the .NET Framework 4.0 manually and then try to install Chocolatey again. `n Download at `'$NetFx4Url`'" + throw "Error installing .NET Framework 4.8 (exit code $($s.ExitCode)). `n Please install the .NET Framework 4.8 manually and reboot the system `n and then try to install/upgrade Chocolatey again. `n Download at `'$NetFx48Url`'" } else { - Write-ChocolateyWarning "Try #$netFx4InstallTries of .NET framework install failed with exit code `'$($s.ExitCode)`'. Trying again." - Install-DotNet4IfMissing $true + Write-ChocolateyWarning "Try #$netFx48InstallTries of .NET framework install failed with exit code `'$($s.ExitCode)`'. Trying again." + Install-DotNet48IfMissing $true } } }