[CmdNotFound]Improve installation workflow (#30727)

* [CmdNotFound]Improve installation workflow

* Fix typo

* Fix XAML styling

* Update src/settings-ui/Settings.UI/SettingsXAML/Views/CmdNotFoundPage.xaml

Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>

* Update src/settings-ui/Settings.UI/SettingsXAML/Views/CmdNotFoundPage.xaml

Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>

* Update src/settings-ui/Settings.UI/SettingsXAML/Views/CmdNotFoundPage.xaml

Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>

* Update src/settings-ui/Settings.UI/SettingsXAML/Views/CmdNotFoundPage.xaml

Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>

* Update src/settings-ui/Settings.UI/SettingsXAML/Views/CmdNotFoundPage.xaml

Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>

* Update src/settings-ui/Settings.UI/SettingsXAML/Views/CmdNotFoundPage.xaml

Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>

* Don't create window for checking requirements

* Hide install/uninstall buttons for CmdNotFound module

* Also install winget before Powershell 7

* Better detect processor architecture

* Fix spellcheck

* [CMDNotFound] UX improvements (#30740)

* UI improvements

* Updated label

* Update CmdNotFoundPage.xaml

* Update CmdNotFoundPage.xaml

* Update CmdNotFoundPage.xaml

* Better version detection

* Add some logging

* Add missing package install that's a prerequisite for winget

* Remove unused AllExperiments include

* Fix Logger library include

* Update PATH Environment variable after installing PS

* Fix OOBE UI spacing

* Use Invoke-WebRequest to get the deps and then install them from local path

* Spellcheck

* TEMP -> TMP

* User path is supposed to come after machine path

---------

Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>
Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: Stefan Markovic <stefan@janeasystems.com>
This commit is contained in:
Jaime Bernardo
2024-01-05 09:26:49 +00:00
committed by GitHub
parent 5f2d8216ad
commit a7907ff63a
12 changed files with 456 additions and 45 deletions

View File

@@ -0,0 +1,41 @@
Write-Host $PSVersionTable
if ($PSVersionTable.PSVersion -ge 7.4)
{
Write-Host "PowerShell 7.4 or greater detected."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
else
{
Write-Host "PowerShell 7.4 or greater not detected. Installation instructions can be found on https://learn.microsoft.com/powershell/scripting/install/installing-powershell-on-windows `r`n"
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
if (Get-Module -ListAvailable -Name Microsoft.WinGet.Client)
{
Write-Host "WinGet Client module detected."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
else {
Write-Host "WinGet Client module not detected. Installation instructions can be found on https://www.powershellgallery.com/packages/Microsoft.WinGet.Client `r`n"
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
if (!(Test-Path $PROFILE))
{
Write-Host "Profile file $PROFILE not found".
New-Item -Path $PROFILE -ItemType File
Write-Host "Created profile file $PROFILE".
}
$profileContent = Get-Content -Path $PROFILE -Raw
if ((-not [string]::IsNullOrEmpty($profileContent)) -and ($profileContent.Contains("34de4b3d-13a8-4540-b76d-b9e8d3851756")))
{
Write-Host "Command Not Found module is registered in the profile file."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
else
{
Write-Host "Command Not Found module is not registered in the profile file."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}

View File

@@ -30,6 +30,8 @@ if($atLeastOneInstanceFound)
{
Set-Content -Path $PROFILE -Value $newContent
Write-Host "Removed the Command Not Found reference from the profile file."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
} else {
Write-Host "No instance of Command Not Found was found in the profile file."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}

View File

@@ -28,6 +28,7 @@ $profileContent = Get-Content -Path $PROFILE -Raw
if ((-not [string]::IsNullOrEmpty($profileContent)) -and ($profileContent.Contains("34de4b3d-13a8-4540-b76d-b9e8d3851756")))
{
Write-Host "Module is already registered in the profile file."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
else
{
@@ -35,4 +36,5 @@ else
Add-Content -Path $PROFILE -Value "`r`nImport-Module `"$scriptPath\WinGetCommandNotFound.psd1`""
Add-Content -Path $PROFILE -Value "#34de4b3d-13a8-4540-b76d-b9e8d3851756"
Write-Host "Module was successfully registered in the profile file."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}

View File

@@ -0,0 +1,81 @@
if ((Get-AppxPackage microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.21")
{
Write-Host "Detected winget. Will try to install PowerShell."
}
else
{
Write-Host "WinGet not detected. Will try to install."
# To speed up Invoke-WebRequest. Older versions are very slow when printing the progress.
$ProgressPreference = 'SilentlyContinue'
$cpuArchitecture="x64"
$detectedArchitecture=""
if ($env:PROCESSOR_ARCHITEW6432 -eq $null) {
$detectedArchitecture=$env:PROCESSOR_ARCHITECTURE
} else {
$detectedArchitecture=$env:PROCESSOR_ARCHITEW6432
}
Write-Host "Detected the CPU architecture:$detectedArchitecture"
if ($detectedArchitecture -ne "AMD64")
{
Write-Host "Mismatch with AMD64, setting it to arm64, since that's where we're likely running."
$cpuArchitecture="arm64"
}
if((Get-AppxPackage Microsoft.VCLibs.140.00).Version -ge [System.Version]"14.0.30704")
{
Write-Host "Detected Microsoft.VCLibs.140.00."
}
else
{
Write-Host "Microsoft.VCLibs.140.00 not detected. Will try to install."
Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.$cpuArchitecture.14.00.Desktop.appx -OutFile "$Env:TMP\Microsoft.VCLibs.14.00.appx"
Add-AppxPackage -Path "$Env:TMP\Microsoft.VCLibs.14.00.appx"
Remove-Item -Path "$Env:TMP\Microsoft.VCLibs.14.00.appx" -Force
}
if((Get-AppxPackage Microsoft.VCLibs.140.00.UWPDesktop).Version -ge [System.Version]"14.0.30704")
{
Write-Host "Detected Microsoft.VCLibs.140.00.UWPDesktop"
}
else
{
Write-Host "Microsoft.VCLibs.140.00.UWPDesktop not detected. Will try to install."
Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.$cpuArchitecture.14.00.Desktop.appx -OutFile "$Env:TMP\Microsoft.VCLibs.14.00.Desktop.appx"
Add-AppxPackage -Path "$Env:TMP\Microsoft.VCLibs.14.00.Desktop.appx"
Remove-Item -Path "$Env:TMP\Microsoft.VCLibs.14.00.Desktop.appx" -Force
}
if (Get-AppxPackage Microsoft.UI.Xaml.2.7)
{
Write-Host "Detected Microsoft.UI.Xaml.2.7"
}
else
{
Write-Host "Microsoft.UI.Xaml.2.7 not detected. Will try to install."
Write-Host "Downloading to $Env:TMP\microsoft.ui.xaml.2.7.3.zip"
Invoke-WebRequest -Uri https://www.nuget.org/api/v2/package/Microsoft.UI.Xaml/2.7.3 -OutFile "$Env:TMP\microsoft.ui.xaml.2.7.3.zip"
Write-Host "Extracting $Env:TMP\microsoft.ui.xaml.2.7.3.zip"
Expand-Archive "$Env:TMP\microsoft.ui.xaml.2.7.3.zip" -DestinationPath "$Env:TMP\microsoft.ui.xaml.2.7.3"
Write-Host "Installing $Env:TMP\microsoft.ui.xaml.2.7.3\tools\AppX\$cpuArchitecture\Release\Microsoft.UI.Xaml.2.7.appx"
Add-AppxPackage "$Env:TMP\microsoft.ui.xaml.2.7.3\tools\AppX\$cpuArchitecture\Release\Microsoft.UI.Xaml.2.7.appx"
Remove-Item -Path "$Env:TMP\microsoft.ui.xaml.2.7.3" -Recurse -Force
Remove-Item -Path "$Env:TMP\microsoft.ui.xaml.2.7.3.zip" -Force
}
Write-Host "Getting winget to the latest stable"
Invoke-WebRequest -Uri https://aka.ms/getwinget -OutFile "$Env:TMP\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"
Add-AppxPackage -Path "$Env:TMP\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"
Remove-Item -Path "$Env:TMP\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle" -Force
#winget is not visible right away, so reload the PATH variable.
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
}
winget install Microsoft.PowerShell --source winget
if ($LASTEXITCODE -eq 0)
{
Write-Host "Powershell 7 successfully installed."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
else
{
Write-Host "Powershell 7 was not installed."
}

View File

@@ -0,0 +1,16 @@
if (Get-Module -ListAvailable -Name Microsoft.WinGet.Client)
{
Write-Host "WinGet Client module detected."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
else {
Install-Module -Name Microsoft.WinGet.Client
if (Get-Module -ListAvailable -Name Microsoft.WinGet.Client)
{
Write-Host "WinGet Client module detected."
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
} else {
Write-Host "WinGet Client module not detected. Installation instructions can be found on https://www.powershellgallery.com/packages/Microsoft.WinGet.Client `r`n"
# This message will be compared against in Command Not Found Settings page code behind. Take care when changing it.
}
}