Skip to content

Instantly share code, notes, and snippets.

@azurekid
Last active July 14, 2023 07:00
Show Gist options
  • Save azurekid/ca641c47981cf8074aeaf6218bb9eb58 to your computer and use it in GitHub Desktop.
Save azurekid/ca641c47981cf8074aeaf6218bb9eb58 to your computer and use it in GitHub Desktop.
PowerShell script to download DevOps Extensions from the marketplace as a local file
[CmdletBinding()]
param
(
[Parameter(Mandatory = $true)]
[string] $Publisher,
[Parameter(Mandatory = $true)]
[string] $ExtensionName,
[Parameter(Mandatory = $true)]
[ValidateScript( {
If ($_ -match "^([0-9]+\.[0-9]+\.[0-9]+)$") {
$True
}
else {
Throw "$_ is not a valid version number. Version can only contain digits"
}
})]
[string] $Version,
[Parameter(Mandatory = $true)]
[string] $OutputLocation
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
Write-Output "Publisher: $($Publisher)"
Write-Output "Extension name: $($ExtensionName)"
Write-Output "Version: $($Version)"
Write-Output "Output location $($OutputLocation)"
$baseUrl = "https://$($Publisher).gallery.vsassets.io/_apis/public/gallery/publisher/$($Publisher)/extension/$($ExtensionName)/$($Version)/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"
$outputFile = "$($Publisher)-$($ExtensionName)-$($Version).visx"
if (Test-Path $OutputLocation) {
try {
Write-Output "Retrieving extension..."
[uri]::EscapeUriString($baseUrl) | Out-Null
Invoke-WebRequest -Uri $baseUrl -OutFile "$OutputLocation\$outputFile"
}
catch {
Write-Error "Unable to find the extension in the marketplace"
}
}
else {
Write-Output "The Path $($OutputLocation) does not exist"
}
@paviad
Copy link

paviad commented Jul 18, 2021

The url structure has changed, it is now:

"https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${Publisher}/vsextensions/${ExtensionName}/${Version}/vspackage"

@uyriq
Copy link

uyriq commented Jul 13, 2023

Great script, @azurekid! I'd like to thank @paviad for modernizing it. Additionally, to allow for versions in the format of d+.d+.d+ (not just d.d.d), it's a good idea to change line 12 from If ($_ -match "^([0-9].[0-9].[0-9])") { to If ($_ -match "^([0-9]+\.[0-9]+\.[0-9]+)$") {.

I ran the script in Bash using the following command:

pwsh /home/user/scripts/script.ps1 -Publisher "GitHub" -ExtensionName "copilot" -Version "1.96.259" -OutputLocation "/home/user/downloads" 

It worked flawlessly!

@azurekid
Copy link
Author

azurekid commented Jul 14, 2023

https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${Publisher}/vsextensions/${ExtensionName}/${Version}/vspackage

Hi thanks for the feedback, and sorry for not coming back earlier to this.
I have updated the url as you have suggested in your comments but that results in an error message that the package could not be found.

Can you add a PR on you r suggestion, maybe I am doing something wrong ;-)

@azurekid
Copy link
Author

Great script, @azurekid! I'd like to thank @paviad for modernizing it. Additionally, to allow for versions in the format of d+.d+.d+ (not just d.d.d), it's a good idea to change line 12 from If ($_ -match "^([0-9].[0-9].[0-9])") { to If ($_ -match "^([0-9]+\.[0-9]+\.[0-9]+)$") {.

I ran the script in Bash using the following command:

pwsh /home/user/scripts/script.ps1 -Publisher "GitHub" -ExtensionName "copilot" -Version "1.96.259" -OutputLocation "/home/user/downloads" 

It worked flawlessly!

hi @uyriq
It has been quiet a while when I wrote this little script, but happy it still seems to work.
I have added your suggestion to the code

Kind Regards,

Rogier

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment