PowerShellGet Find-Both

For years now, I've had a handful of personal functions living as a part of my $PROFILE script -- the CurrentUserAllHosts version. This specific profile script ensures it's available for use regardless of which PowerShell host program I use: the ConsoleHost, the ISE, VS Code, etc. One of these functions -- Show-PSGalleryProject -- goes out to the PowerShell Gallery and returns the current download count of all the modules and scripts I've added to the gallery. It also determines the combined download total.

The below image was rescued from an old Twitter post, back when the function worked as expected. Don't mind the black background color. It was demo of my TMOutput module. Again, this was the output produced back when the function originally worked. It's not currently working, but with any luck that's about to change.

Before we continue, let's take a quick look at the underlying code that created the above output.

Set-Alias -Name Watch-PSGalleryProject -Value Show-PSGalleryProject
Function Show-PSGalleryProject {
    Param (
        [System.Array]$Projects = ('TMOutput','Start-1to100Game3.0','Get-TMVerbSynonym','SinkProfile','Show-PSDriveMenu','Switch-Prompt')
    )

    Foreach ($Project in $Projects) {
        $TempVar = Find-Module -Name $Project
        [PSCustomObject]@{
            Name = $TempVar.Name
            Version = $TempVar.Version
            Downloads = $TempVar.AdditionalMetadata.downloadCount
        }
        [int]$TotalDownloads += $TempVar.AdditionalMetadata.downloadCount
    }
    ">> Total downloads: $TotalDownloads"
}

At some point, and I'm not sure when, the Find-Module function stopped working against scripts in the PowerShell Gallery. Additionally, Find-Script potentially stopped working against modules. Now that said, I'm not even certain when Find-Script was added and if it ever worked against modules hosted in the PowerShell Gallery. Regardless, I need a way now to rewrite this personal function, so that it invokes the correct PowerShellGet function against the proper project: Find-Module against modules and Find-Script against scripts. Before we work on that solution, here's what my function returns now. Ugh.

The Show-PSGalleryProject function's failed invocation.

I started writing this post prior to writing the solution. Once I dug in, it really only took a few changes to see that this was working again. While it wasn't difficult, I've opted to continue the post and share my results, even if, you've already calculated a way in which a single function could check one function (Find-Module), before another (Find-Script). Here's my updated code and the current, and corrected, results.

Set-Alias -Name Watch-PSGalleryProject -Value Show-PSGalleryProject
Function Show-PSGalleryProject {
    Param (
        [System.Array]$Projects = ('TMOutput','Start-1to100Game3.0','Get-TMVerbSynonym','SinkProfile','Show-PSDriveMenu','Switch-Prompt')
    )

    Foreach ($Project in $Projects) {
        If (Find-Module -Name $Project -ErrorAction SilentlyContinue) {
            $TempVar = Find-Module -Name $Project
        } ElseIf (Find-Script -Name $Project) {
            $TempVar = Find-Script -Name $Project
        }
        [PSCustomObject]@{
            Name = $TempVar.Name
            Version = $TempVar.Version
            Downloads = $TempVar.AdditionalMetadata.downloadCount
        }
        [int]$TotalDownloads += $TempVar.AdditionalMetadata.downloadCount
    }
    ">> Total downloads: $TotalDownloads"
}

It's not too much slower than it used to be, but it's always been somewhat slow. There is without question, a noticeable delay doing separate and individual searches against the PowerShell Gallery (and -Filter didn't seem to return more than a single result the last time I checked). It's fine for me, however (for now). I have considered doing the search as a part of a background process or when the profile is loaded. Either way, I'm back in business for today.

About Tommy Maynard

IT Pro. Passionate for #PowerShell, #AWS (certified x2), & all things automation. I'm not done learning. Author in #PSConfBook. Writes at https://powershell.org.

2 thoughts on “PowerShellGet Find-Both

  1. Svilen

    May be this will speed up the things a bit:

    PS>$package = irm "https://www.powershellgallery.com/api/v2/FindPackagesById()?id='TMOutput'" | Sort-Object -Descending @{Expression = {$PSItem.properties.version}} | select -First 1
    PS>$package.properties.Version
    1.1
    PS>$package.properties.DownloadCount.'#text'
    1115

    PS>Measure-Command -Expression { irm "https://www.powershellgallery.com/api/v2/FindPackagesById()?id='TMOutput'" | Sort-Object -Descending @{Expression = {$PSItem.properties.version}} | select -First 1} | % TotalSeconds
    0,1412608

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.