Notice: The following post was originally published on another website. As the post is no longer accessible, it is being republished here on tommymaynard.com. The post was originally published on July 15, 2019.
There’s a function stored in my $PROFILE
(CurrentUserAllHosts
). Maybe you’ve read about it before; it’s come up. Its purpose is to go out to the PowerShell Gallery and determine how many downloads I have of each PowerShell script and/or module I’ve published there. In the past, my tool provided a download total for each project along with a single total of all the downloads. Today that changes, but before it does (I seriously haven’t the updated code yet — typical), let’s show the code and results, as it currently stands.
Function Showw-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" } # End Function: Show-PSGalleryProject. Show-PSGalleryProject
Name Version Downloads ---- ------- --------- TMOutput 1.1 1193 Start-1to100Game3.0 3.0 170 Get-TMVerbSynonym 1.4 163 SinkProfile 1.0 100 Show-PSDriveMenu 1.1 69 Switch-Prompt 1.2.0 84 >> Total downloads: 1779
See how we only have the single Total downloads above (the 1779 value)? I’ve decided I don’t like that, so it’s about to change. I want the total downloads as each of these objects are being returned (, calculated,) and written.
In the newest version of this little $PROFILE
-based function — there was an earlier one — the first thing I’ve done is added the [CmdletBinding]
Attribute. It’s to add the OutVariable
Common Parameter. We’ll see how that’s helpful momentarily. The second thing we’ve done is begun collecting and displaying, what I’ve called the Type (find in the below code: ; $Type = Module
or Script
). This will differentiate when added to each object, whether one of my projects in the PowerShell Gallery is a module or script. Here’s the updated code with these two additions. Notice also, the object created inside [PSCustomObject]
now includes a Type
property. This is where the Module
or Script
determinations are included.
Function Show-PSGalleryProject { [CmdletBinding()] 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; $Type = 'Module' } ElseIf (Find-Script -Name $Project) { $TempVar = Find-Script -Name $Project; $Type = 'Script' } $TotalDownloads = [int]$TotalDownloads + [int]$TempVar.AdditionalMetadata.downloadCount [PSCustomObject]@{ Name = $TempVar.Name Type = $Type Version = $TempVar.Version Downloads = $TempVar.AdditionalMetadata.downloadCount TotalDownloads = $TotalDownloads } } # End Foreach. } # End Function: Show-PSGalleryProject. Show-PSGalleryProject
The other recent addition to this code is the addition of my $TotalDownloads
variable. Through each iteration, we update it so it has the current value and then displays said current value with the current object. I may have been a little too generous with my [int]
casting; however, do remember that the plus sign (+
) is also a concatenation operator. I want a total download count — not a string of individual download counts, strung together.
In closing, there’s something else to remember. By default (and there are ways around this), when we have more than four properties being returned per object, the “table” output becomes a “list” output — have a look.
Name : TMOutput Type : Module Version : 1.1 Downloads : 1193 TotalDownloads : 1193 Name : Start-1to100Game3.0 Type : Script Version : 3.0 Downloads : 170 TotalDownloads : 1363 Name : Get-TMVerbSynonym Type : Script Version : 1.4 Downloads : 163 TotalDownloads : 1526 Name : SinkProfile Type : Module Version : 1.0 Downloads : 100 TotalDownloads : 1626 Name : Show-PSDriveMenu Type : Script Version : 1.1 Downloads : 69 TotalDownloads : 1695 Name : Switch-Prompt Type : Script Version : 1.2.0 Downloads : 84 TotalDownloads : 1779
While using the newly added OutVariable
is helpful if I want to display the above output and capture the output into a variable at the same time, here’s how I run this now.
$PS = Show-PSGalleryProject $PS | Format-Table -AutoSize
Name Type Version Downloads TotalDownloads ---- ---- ------- --------- -------------- TMOutput Module 1.1 1193 1193 Start-1to100Game3.0 Script 3.0 170 1363 Get-TMVerbSynonym Script 1.4 163 1526 SinkProfile Module 1.0 100 1626 Show-PSDriveMenu Script 1.1 69 1695 Switch-Prompt Script 1.2.0 84 1779
Next up is likely putting this code into a background job; it’s not the quickest thing I’ve written (although I blame that on the speed of the PowerShell Gallery lookup process, perhaps). Maybe a background job that runs in, or starts at, the end of the profile script. This, in order that these slow-to-obtain results are available sooner and with minimal impact.
Edit: 2/5/2022 – I never did do that, although this function does still exists in my $PROFILE
script. Now that I have seen this post again, perhaps there will be another push to try that. Time will tell. Oh, and here are my updated totals since this post was first written and published.
Name Type Version Downloads TotalDownloads ---- ---- ------- --------- -------------- TMOutput Module 1.1 2980 2980 Start-1to100Game3.0 Script 3.0 266 3246 Get-TMVerbSynonym Script 1.4 293 3539 SinkProfile Module 1.0 302 3841 Show-PSDriveMenu Script 1.1 186 4027 Switch-Prompt Script 1.2.0 236 4263