How to add your PowerShell blog to Planet PowerShell

Do you blog about PowerShell? If so, consider adding your blog site to Planet PowerShell which is an aggregator of content from PowerShell Community members. There are some guidelines for submission on their GitHub page so be sure to take a look at it before continuing. Instructions for adding your blog also exists on that page, but I've recently seen a number of tweets about it being too difficult or too much work. To be honest with you, if everything in IT was as easy as adding my blog to Planet PowerShell, I probably wouldn't have a job. I decided to try to make the process a little easier, regardless (I'm not affiliated with Planet PowerShell other than having added my blog to it).

First, you need to fork the Planet PowerShell repository on GitHub:

planet-powershell1a.png

Forking a repository creates your own personal copy of it underneath your GitHub account as denoted by #1 in the following image:

planet-powershell2a.png

Go to your copy of the Planet PowerShell repository on GitHub. Click on the "Clone or download" button (#2) and then click on the "Copy to clipboard" button (#3).

Clone your copy of the repository to your computer. Be sure to change the source path to match your copy of the Planet PowerShell repository (use the path that you copied to your clipboard in the previous step). Change the destination path if needed. I'll store the destination path in a variable named $LocalPath since I'll be using it again later in this blog article.

1$LocalPath = 'U:\GitHub\planetpowershell'
2git clone https://github.com/mikefrobbins/planetpowershell.git $LocalPath

planet-powershell3a.png

If you don't already have Git installed (which is used in the previous example) or if you're not familiar with Git, you can find more information about it in my blog article titled Getting Started with the Git Version Control System.

I'll store my first and last name in variables since they'll be used throughout this blog article. Your name should be in proper case.

1$FirstName = 'Mike'
2$LastName = 'Robbins'

planet-powershell12a.png

I wrote a PowerShell function to create your author file for Planet PowerShell. This function is part of my MrToolkit module which can be found in my PowerShell repository on GitHub. It uses some of the other functions found in that module as well as my MrGeo module which can be found in my ScriptingGames repository on GitHub.

  1#Requires -Version 3.0 -Modules MrGeo
  2function New-MrPlanetPowerShellAuthor {
  3
  4<#
  5.SYNOPSIS
  6    Creates the author information required to add your PowerShell related blog to Planet PowerShell.
  7
  8.DESCRIPTION
  9    New-MrPlanetPowerShellAuthor is an advanced function that creates the author information required
 10    to add your PowerShell related blog to Planet PowerShell (http://www.planetpowershell.com/). Planet
 11    PowerShell is an aggregator of content from PowerShell Community members.
 12
 13.PARAMETER FirstName
 14    Author's first name.
 15
 16.PARAMETER LastName
 17    Author's last name.
 18
 19.PARAMETER Bio
 20    Short bio about the author.
 21
 22.PARAMETER StateOrRegion
 23    Your geographical location, i.e.: Holland, New York, etc.
 24
 25.PARAMETER EmailAddress
 26    Email address. Only enter if you want your email address to be publicly available.
 27
 28.PARAMETER TwitterHandle
 29    Twitter handle without the leading @.
 30
 31.PARAMETER GravatarEmailAddress
 32    The email address you use at gravatar.com. Entering this causes the picture used at Gravatar.com to
 33    be used as your author picture on Planet PowerShell. The email address is converted to the MD5 hash
 34    of the email address string.
 35
 36.PARAMETER GitHubHandle
 37    GitHub handle without the leading @.
 38
 39.PARAMETER BlogUri
 40    URL of your blog site.
 41
 42.PARAMETER RssUri
 43    URL for the RSS feed to your blog site.
 44
 45.PARAMETER MicrosoftMVP
 46    Switch parameter. Specify if you're a Microsoft MVP.
 47
 48.PARAMETER FilterToPowerShell
 49    Switch parameter. Specify if you blog on more than just PowerShell.
 50
 51.EXAMPLE
 52    New-MrPlanetPowerShellAuthor -FirstName Mike -LastName Robbins -Bio 'Microsoft PowerShell MVP and SAPIEN Technologies MVP. Leader & Co-founder of MSPSUG' -StateOrRegion 'Mississippi, USA' -TwitterHandle mikefrobbins -GravatarEmailAddress mikefrobbins@users.noreply.github.com -GitHubHandle mikefrobbins -BlogUri mikefrobbins.com -RssUri mikefrobbins.com/feed -MicrosoftMVP -FilterToPowerShell |
 53    New-Item -Path C:\GitHub\planetpowershell\src\Firehose.Web\Authors\MikeRobbins.cs
 54
 55.INPUTS
 56    None
 57
 58.OUTPUTS
 59    System.String
 60
 61.NOTES
 62    Author:  Mike F Robbins
 63    Website: http://mikefrobbins.com
 64    Twitter: @mikefrobbins
 65#>
 66
 67    [CmdletBinding()]
 68    param (
 69        [Parameter(Mandatory)]
 70        [string]$FirstName,
 71
 72        [Parameter(Mandatory)]
 73        [string]$LastName,
 74
 75        [string]$Bio,
 76
 77        [string]$StateOrRegion,
 78
 79        [string]$EmailAddress,
 80
 81        [string]$TwitterHandle,
 82
 83        [string]$GravatarEmailAddress,
 84
 85        [string]$GitHubHandle,
 86
 87        [Parameter(Mandatory)]
 88        [string]$BlogUri,
 89
 90        [string]$RssUri,
 91
 92        [switch]$MicrosoftMVP,
 93
 94        [switch]$FilterToPowerShell
 95    )
 96
 97    $BlogUrl = (Test-MrURL -Uri $BlogUri -Detailed).ResponseUri
 98
 99    if ($PSBoundParameters.RssUri) {
100        $RssUrl = (Test-MrURL -Uri $RssUri -Detailed).ResponseUri
101    }
102
103    $GravatarHash = (Get-MrHash -String $GravatarEmailAddress).ToLower()
104    $Location = Get-MrGeoInformation
105    $GeoLocation = -join ($Location.Latitude, ', ', $Location.Longitude)
106
107    if ($MicrosoftMVP) {
108        $Interface = 'IAmAMicrosoftMVP'
109    }
110    else {
111        $Interface = 'IAmACommunityMember'
112    }
113
114    if ($FilterToPowerShell) {
115        $Interface = "$Interface, IFilterMyBlogPosts"
116
117        $SyndicationItem =
118@'
119public bool Filter(SyndicationItem item)
120        {
121            return item.Categories.Any(c => c.Name.ToLowerInvariant().Equals("powershell"));
122        }
123'@
124    }
125
126@"
127using System;
128using System.Collections.Generic;
129using System.Linq;
130using System.ServiceModel.Syndication;
131using System.Web;
132using Firehose.Web.Infrastructure;
133namespace Firehose.Web.Authors
134{
135    public class $FirstName$LastName : $Interface
136    {
137        public string FirstName => `"$FirstName`";
138        public string LastName => `"$LastName`";
139        public string ShortBioOrTagLine => `"$Bio`";
140        public string StateOrRegion => `"$StateOrRegion`";
141        public string EmailAddress => `"$EmailAddress`";
142        public string TwitterHandle => `"$TwitterHandle`";
143        public string GitHubHandle => `"$GitHubHandle`";
144        public string GravatarHash => `"$GravatarHash`";
145        public GeoPosition Position => new GeoPosition($GeoLocation);
146
147        public Uri WebSite => new Uri(`"$BlogUrl`");
148        public IEnumerable<Uri> FeedUris { get { yield return new Uri(`"$RssUrl`"); } }
149
150        $SyndicationItem
151    }
152}
153"@
154
155}

Simply run the function and provide your information via parameter input.

The output can be used to create the necessary .cs file:

1New-MrPlanetPowerShellAuthor -FirstName $FirstName -LastName $LastName -Bio 'Microsoft PowerShell MVP and SAPIEN Technologies MVP. Leader & Co-founder of MSPSUG' -StateOrRegion 'Mississippi, USA' -TwitterHandle mikefrobbins -GravatarEmailAddress mikefrobbins@users.noreply.github.com -GitHubHandle mikefrobbins -BlogUri mikefrobbins.com -RssUri mikefrobbins.com/feed -MicrosoftMVP -FilterToPowerShell |
2New-Item -Path $LocalPath\src\Firehose.Web\Authors\$FirstName$LastName.cs

planet-powershell4d.png

Verify that the contents of the .cs file looks correct:

1Get-Content -Path $LocalPath\src\Firehose.Web\Authors\$FirstName$LastName.cs

planet-powershell6d.png

Add the class to the .csproj file:

1$xml = [xml](Get-Content -Path "$LocalPath\src\Firehose.Web\Firehose.Web.csproj")
2$element = $xml.CreateElement('Compile')
3$element.SetAttribute('Include',"Authors\$FirstName$LastName.cs")
4$xml.Project.ItemGroup[2].AppendChild($element)
5$xml = [xml]$xml.OuterXml.Replace(" xmlns=`"`"", "")
6$xml.Save("$LocalPath\src\Firehose.Web\Firehose.Web.csproj")

planet-powershell5b.png

Verify the class has been added:

1([xml](Get-Content -Path "$LocalPath\src\Firehose.Web\Firehose.Web.csproj")).Project.ItemGroup[2].Compile |
2Where-Object Include -like *authors*

planet-powershell7b.png

I can see that one file has been added and one file has been modified in my local copy of my Planet PowerShell repo:

1git status

planet-powershell8a.png

Do you like how my PowerShell prompt changes automatically when I'm in a directory that's part of a Git repository? If so, be sure to see my blog article on Configuring the PowerShell ISE for use with Git and GitHub.

Add any new or modified files, commit them to the local copy of the repository, and push the changes to your copy of the repository on GitHub:

1git add .
2git commit -m 'Added author information for Mike Robbins'
3git push

planet-powershell9a.png

Submit a pull request:

planet-powershell10a.png

Click the "Create pull request button":

planet-powershell11a.png

The pull request has to be reviewed and approved by the owners of Planet PowerShell. Once that occurs, it may take a few days for your blog articles to start showing up in their RSS feed.


Update 3/30/2017

I've added the one function in the MrGeo module to the MrToolkit module so only one module is required. I've also updated my MrToolkit module on the PowerShell Gallery so you can simply run Install-Module -Name MrToolkit -Force to install the module on a computer with PowerShell version 5.0 or higher or one that has installed the package management MSI for down-level versions.

µ