-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Change install to winget, nuget, msstore (#3088)
- Loading branch information
1 parent
0779dd9
commit d6c1fbe
Showing
6 changed files
with
128 additions
and
993 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# Import the function (adjust the path according to your setup) | ||
. "./functions/private/Get-WinUtilWingetLatest.ps1" | ||
|
||
# Set up Information stream to be visible | ||
$InformationPreference = "Continue" | ||
|
||
Write-Host "Starting Winget installation test..." -ForegroundColor Cyan | ||
|
||
try { | ||
# Test the function with verbose output | ||
Write-Host "Attempting to run Get-WinUtilWingetLatest..." -ForegroundColor Cyan | ||
Get-WinUtilWingetLatest -Verbose | ||
|
||
# Verify Winget is working | ||
if (Get-Command winget -ErrorAction SilentlyContinue) { | ||
Write-Host "Success! Winget is installed and accessible." -ForegroundColor Green | ||
|
||
# Display Winget version | ||
Write-Host "`nWinget version:" -ForegroundColor Cyan | ||
winget --version | ||
} else { | ||
Write-Host "Warning: Winget is installed but not accessible in the current session. You may need to restart your terminal." -ForegroundColor Yellow | ||
} | ||
} catch { | ||
Write-Host "Error occurred during testing: $($_.Exception.Message)" -ForegroundColor Red | ||
Write-Host "Stack Trace:" -ForegroundColor Red | ||
$_.ScriptStackTrace | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,26 +1,104 @@ | ||
function Get-WinUtilWingetLatest { | ||
[CmdletBinding()] | ||
param() | ||
|
||
<# | ||
.SYNOPSIS | ||
Uses GitHub API to check for the latest release of Winget. | ||
.DESCRIPTION | ||
This function grabs the latest version of Winget and returns the download path to Install-WinUtilWinget for installation. | ||
This function first attempts to update WinGet using winget itself, then falls back to manual installation if needed. | ||
#> | ||
# Invoke-WebRequest is notoriously slow when the byte progress is displayed. The following lines disable the progress bar and reset them at the end of the function | ||
$PreviousProgressPreference = $ProgressPreference | ||
$ProgressPreference = "silentlyContinue" | ||
$ProgressPreference = "SilentlyContinue" | ||
$InformationPreference = 'Continue' | ||
|
||
try { | ||
# Grabs the latest release of Winget from the Github API for the install process. | ||
$response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop | ||
$latestVersion = $response.tag_name #Stores version number of latest release. | ||
$licenseWingetUrl = $response.assets.browser_download_url | Where-Object {$_ -like "*License1.xml"} #Index value for License file. | ||
Write-Host "Latest Version:`t$($latestVersion)`n" | ||
Write-Host "Downloading..." | ||
$assetUrl = $response.assets.browser_download_url | Where-Object {$_ -like "*Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"} | ||
Invoke-WebRequest -Uri $licenseWingetUrl -OutFile $ENV:TEMP\License1.xml | ||
# The only pain is that the msixbundle for winget-cli is 246MB. In some situations this can take a bit, with slower connections. | ||
Invoke-WebRequest -Uri $assetUrl -OutFile $ENV:TEMP\Microsoft.DesktopAppInstaller.msixbundle | ||
} catch { | ||
throw [WingetFailedInstall]::new('Failed to get latest Winget release and license') | ||
$wingetCmd = Get-Command winget -ErrorAction Stop | ||
Write-Information "Attempting to update WinGet using WinGet..." | ||
$result = Start-Process -FilePath "`"$($wingetCmd.Source)`"" -ArgumentList "install -e --accept-source-agreements --accept-package-agreements Microsoft.AppInstaller" -Wait -NoNewWindow -PassThru | ||
if ($result.ExitCode -ne 0) { | ||
throw "WinGet update failed with exit code: $($result.ExitCode)" | ||
} | ||
return $true | ||
} | ||
catch { | ||
Write-Information "WinGet not found or update failed. Attempting to install from Microsoft Store..." | ||
try { | ||
# Try to close any running WinGet processes | ||
Get-Process -Name "DesktopAppInstaller", "winget" -ErrorAction SilentlyContinue | ForEach-Object { | ||
Write-Information "Stopping running WinGet process..." | ||
$_.Kill() | ||
Start-Sleep -Seconds 2 | ||
} | ||
|
||
# Try to load Windows Runtime assemblies more reliably | ||
$null = [System.Runtime.WindowsRuntime.WindowsRuntimeSystemExtensions] | ||
Add-Type -AssemblyName System.Runtime.WindowsRuntime | ||
|
||
# Load required assemblies from Windows SDK | ||
$null = @( | ||
[Windows.Management.Deployment.PackageManager, Windows.Management.Deployment, ContentType = WindowsRuntime] | ||
[Windows.Foundation.Uri, Windows.Foundation, ContentType = WindowsRuntime] | ||
[Windows.Management.Deployment.DeploymentOptions, Windows.Management.Deployment, ContentType = WindowsRuntime] | ||
) | ||
|
||
# Initialize PackageManager | ||
$packageManager = New-Object Windows.Management.Deployment.PackageManager | ||
|
||
# Rest of the Microsoft Store installation logic | ||
$appxPackage = "https://aka.ms/getwinget" | ||
$uri = New-Object Windows.Foundation.Uri($appxPackage) | ||
$deploymentOperation = $packageManager.AddPackageAsync($uri, $null, "Add") | ||
|
||
# Add timeout check for deployment operation | ||
$timeout = 300 | ||
$timer = [System.Diagnostics.Stopwatch]::StartNew() | ||
|
||
while ($deploymentOperation.Status -eq 0) { | ||
if ($timer.Elapsed.TotalSeconds -gt $timeout) { | ||
throw "Installation timed out after $timeout seconds" | ||
} | ||
Start-Sleep -Milliseconds 100 | ||
} | ||
|
||
if ($deploymentOperation.Status -eq 1) { | ||
Write-Information "Successfully installed WinGet from Microsoft Store" | ||
return $true | ||
} else { | ||
throw "Installation failed with status: $($deploymentOperation.Status)" | ||
} | ||
} | ||
catch [System.Management.Automation.RuntimeException] { | ||
Write-Information "Windows Runtime components not available. Attempting manual download..." | ||
try { | ||
# Try to close any running WinGet processes | ||
Get-Process -Name "DesktopAppInstaller", "winget" -ErrorAction SilentlyContinue | ForEach-Object { | ||
Write-Information "Stopping running WinGet process..." | ||
$_.Kill() | ||
Start-Sleep -Seconds 2 | ||
} | ||
|
||
# Fallback to direct download from GitHub | ||
$apiUrl = "https://api.github.com/repos/microsoft/winget-cli/releases/latest" | ||
$release = Invoke-RestMethod -Uri $apiUrl | ||
$msixBundleUrl = ($release.assets | Where-Object { $_.name -like "*.msixbundle" }).browser_download_url | ||
|
||
$tempFile = Join-Path $env:TEMP "Microsoft.DesktopAppInstaller.msixbundle" | ||
Invoke-WebRequest -Uri $msixBundleUrl -OutFile $tempFile | ||
|
||
Add-AppxPackage -Path $tempFile -ErrorAction Stop | ||
Remove-Item $tempFile -Force | ||
|
||
Write-Information "Successfully installed WinGet from GitHub release" | ||
return $true | ||
} | ||
catch { | ||
Write-Error "Failed to install WinGet: $_" | ||
return $false | ||
} | ||
} | ||
catch { | ||
Write-Error "Failed to install WinGet: $_" | ||
return $false | ||
} | ||
} | ||
$ProgressPreference = $PreviousProgressPreference | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.