diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index f00870c9283..40a6a085f5e 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -745,6 +745,7 @@ Kybd languagesjson lastcodeanalysissucceeded Lastdevice +LASTEXITCODE LAYOUTRTL LCIDTo lcl @@ -917,6 +918,7 @@ MSIFASTINSTALL MSIHANDLE msiquery MSIRESTARTMANAGERCONTROL +msixbundle MSIXCA MSLLHOOKSTRUCT Mso diff --git a/installer/PowerToysSetup/Settings.wxs b/installer/PowerToysSetup/Settings.wxs index b9c27b00c4f..a31903d643b 100644 --- a/installer/PowerToysSetup/Settings.wxs +++ b/installer/PowerToysSetup/Settings.wxs @@ -54,6 +54,9 @@ + + + diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Scripts/CheckCmdNotFoundRequirements.ps1 b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/CheckCmdNotFoundRequirements.ps1 new file mode 100644 index 00000000000..260d75c5334 --- /dev/null +++ b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/CheckCmdNotFoundRequirements.ps1 @@ -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. +} diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Scripts/DisableModule.ps1 b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/DisableModule.ps1 index fef86f49359..501c4c4141e 100644 --- a/src/settings-ui/Settings.UI/Assets/Settings/Scripts/DisableModule.ps1 +++ b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/DisableModule.ps1 @@ -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. } diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Scripts/EnableModule.ps1 b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/EnableModule.ps1 index 844613a2be4..3b4842dba14 100644 --- a/src/settings-ui/Settings.UI/Assets/Settings/Scripts/EnableModule.ps1 +++ b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/EnableModule.ps1 @@ -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. } diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Scripts/InstallPowerShell7.ps1 b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/InstallPowerShell7.ps1 new file mode 100644 index 00000000000..a6af1c66e2e --- /dev/null +++ b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/InstallPowerShell7.ps1 @@ -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." +} + diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Scripts/InstallWinGetClientModule.ps1 b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/InstallWinGetClientModule.ps1 new file mode 100644 index 00000000000..ed48ac84e40 --- /dev/null +++ b/src/settings-ui/Settings.UI/Assets/Settings/Scripts/InstallWinGetClientModule.ps1 @@ -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. + } +} diff --git a/src/settings-ui/Settings.UI/PowerToys.Settings.csproj b/src/settings-ui/Settings.UI/PowerToys.Settings.csproj index 16c118872a4..90a9709dfb1 100644 --- a/src/settings-ui/Settings.UI/PowerToys.Settings.csproj +++ b/src/settings-ui/Settings.UI/PowerToys.Settings.csproj @@ -119,19 +119,28 @@ VSTHRD002;VSTHRD110;VSTHRD100;VSTHRD200;VSTHRD101 - - - Always - - + + + Always + + - - - Always - - - Always - - + + + Always + + + Always + + + Always + + + Always + + + Always + + diff --git a/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeCmdNotFound.xaml b/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeCmdNotFound.xaml index d08cea71aae..2ba83a2a0b6 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeCmdNotFound.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeCmdNotFound.xaml @@ -12,10 +12,10 @@ - + - + - + + + + @@ -20,25 +27,115 @@ IsTabStop="{x:Bind Mode=OneWay, Path=ViewModel.IsEnabledGpoConfigured}" Severity="Informational" /> - - -