-
-
Save amandadebler/ecb3f6ea79ec939acdf12e25710040e1 to your computer and use it in GitHub Desktop.
PowerShell Gallery Module - Bootleg Edition
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
<# | |
Forked from https://github.com/jaykul Gist, posted in response to my Twitter | |
whinge about PowerShellGet in the enterprise - Thank you, Joel Bennett! | |
This adds the ability to use a web proxy, using your current session's | |
credentials. Might add option to use other credentials, if there's demand. | |
It also adds a 'BL' (Bootleg) prefix to the nouns, just to prevent confusion with the "real" | |
cmdlets. Feel free to remove them. | |
ToDo: Use parameter sets :) | |
Examples: | |
Get Chrissy LeMaire and Co's outstanding dbatools for inspection: | |
Find-BLModule dbatools | Save-BLModule -Destination c:\temp | |
Get dbatools for inspection if you're stuck behind a proxy the requires your Windows credentials: | |
Find-BLModule dbatools -Proxy http://proxy.mandie.net | Save-BLModule -Destination c:\temp -Proxy http://proxy.mandie.net | |
#> | |
function Find-BLModule { | |
<# | |
.Synopsis | |
A wrapper for Invoke-RestMethod to search the PowerShell Gallery | |
.Description | |
In order to support wildcards, we build pretty complicated URLs, | |
and then we filter the results by title | |
#> | |
[CmdletBinding()] | |
param ( | |
# The module name (supports the * wildcard) | |
[string]$Name, | |
# Your web proxy, if any (use full "http://..." address) | |
[String]$Proxy | |
) | |
if ($Proxy) { | |
$ProxySettings = @{ | |
Proxy = $Proxy; | |
ProxyUseDefaultCredentials = $true | |
} | |
} | |
# We can support wildcards by splitting, searching for each piece, and then filtering the results | |
# Build a URL using substringof | |
$filter = @($Name.Trim('*').Split('*') | ForEach-Object { "substringof('$_',Id)" }) -join " and " | |
$url = "https://www.powershellgallery.com/api/v2/Packages?`$filter=$filter and IsLatestVersion" | |
# Fetch results and filter them with -like, and then shape the output | |
# Should totally have used parameter sets. Whatever. | |
if ($proxy) { | |
$result = Invoke-RestMethod -Uri $url @ProxySettings | |
} else { | |
$result = Invoke-RestMethod -Uri $url | |
} | |
$result | Where-Object { $_.title.'#text' -like $Name } | | |
Select-Object @{n='Name';ex={$_.title.'#text'}}, | |
@{n='Version';ex={$_.properties.version}}, | |
@{n='Url';ex={$_.Content.src}} | |
} | |
function Save-BLModule { | |
<# | |
.Synopsis | |
A wrapper for Invoke-WebRequest -OutFile to save modules with the nuget package file names | |
#> | |
[CmdletBinding()] | |
param ( | |
# The Url to download from | |
[Parameter(ValueFromPipelineByPropertyName=$true, Mandatory=$true)] | |
$Url, | |
# The name of the module (for naming the output file) | |
[Parameter(ValueFromPipelineByPropertyName=$true, Mandatory=$true)] | |
$Name, | |
# The version of the module (for naming the output file) | |
[Parameter(ValueFromPipelineByPropertyName=$true)] | |
$Version="", | |
# The folder to save to | |
[Alias("Path")] | |
[string]$Destination = $pwd, | |
# Your web proxy, if any | |
[String]$Proxy | |
) | |
begin { | |
if ($Proxy) { | |
$ProxySettings = @{ | |
Proxy = $Proxy; | |
ProxyUseDefaultCredentials = $true | |
} | |
} | |
} | |
process { | |
if($Destination -eq "CurrentUser") { | |
$Destination = Join-Path ([Environment]::GetFolderPath("MyDocuments")) "WindowsPowerShell\Modules" | |
} | |
if($Destination -eq "AllUsers" -or $Destination -eq "LocalMachine") { | |
$Destination = Join-Path ([Environment]::GetFolderPath("ProgramFiles")) "WindowsPowerShell\Modules" | |
} | |
if(-not (Test-Path $Destination)) { | |
$null = mkdir $Destination -force | |
} | |
$Path = Join-Path $Destination "$Name.$Version.nupkg" | |
if ($proxy) { | |
Invoke-WebRequest -Uri $Url -OutFile $Path @ProxySettings | |
} else { | |
Invoke-WebRequest -Uri $Url -OutFile $Path | |
} | |
Get-Item $Path | |
} | |
} | |
function Install-BLModule { | |
<# | |
.Synopsis | |
A wrapper for Extract-Archive to unzip modules from nuget packages | |
#> | |
[CmdletBinding()] | |
param ( | |
# The Url to download from | |
[Parameter(ValueFromPipelineByPropertyName=$true, Mandatory=$true)] | |
[Alias("PSPath")] | |
$Path, | |
# The folder to save to | |
[string]$Destination = "AllUsers" | |
) | |
process { | |
if($Destination -eq "CurrentUser") { | |
$Destination = Join-Path ([Environment]::GetFolderPath("MyDocuments")) "WindowsPowerShell\Modules" | |
} | |
if($Destination -eq "AllUsers" -or $Destination -eq "LocalMachine") { | |
$Destination = Join-Path ([Environment]::GetFolderPath("ProgramFiles")) "WindowsPowerShell\Modules" | |
} | |
if(-not (Test-Path $Destination)) { | |
$null = mkdir $Destination -force | |
} | |
if([IO.Path]::GetExtension($Path) -eq ".nupkg") { | |
$Path = Rename-Item $Path ([IO.Path]::ChangeExtension([IO.Path]::GetFileName($Path), ".zip")) -Passthru | |
} | |
$Module, $Version = $Path.BaseName -split "\.",2 | |
Expand-Archive $Path -Destination (Join-Path $Destination (Join-Path $Module $Version)) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment