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.

$LocalPath = 'U:\GitHub\planetpowershell'
git 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.

$FirstName = 'Mike'
$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.

#Requires -Version 3.0 -Modules MrGeo
function New-MrPlanetPowerShellAuthor {

<#
.SYNOPSIS
    Creates the author information required to add your PowerShell related blog to Planet PowerShell.

.DESCRIPTION
    New-MrPlanetPowerShellAuthor is an advanced function that creates the author information required
    to add your PowerShell related blog to Planet PowerShell (http://www.planetpowershell.com/). Planet
    PowerShell is an aggregator of content from PowerShell Community members.

.PARAMETER FirstName
    Author's first name.

.PARAMETER LastName
    Author's last name.

.PARAMETER Bio
    Short bio about the author.

.PARAMETER StateOrRegion
    Your geographical location, i.e.: Holland, New York, etc.

.PARAMETER EmailAddress
    Email address. Only enter if you want your email address to be publicly available.

.PARAMETER TwitterHandle
    Twitter handle without the leading @.

.PARAMETER GravatarEmailAddress
    The email address you use at gravatar.com. Entering this causes the picture used at Gravatar.com to
    be used as your author picture on Planet PowerShell. The email address is converted to the MD5 hash
    of the email address string.

.PARAMETER GitHubHandle
    GitHub handle without the leading @.

.PARAMETER BlogUri
    URL of your blog site.

.PARAMETER RssUri
    URL for the RSS feed to your blog site.

.PARAMETER MicrosoftMVP
    Switch parameter. Specify if you're a Microsoft MVP.

.PARAMETER FilterToPowerShell
    Switch parameter. Specify if you blog on more than just PowerShell.

.EXAMPLE
    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 |
    New-Item -Path C:\GitHub\planetpowershell\src\Firehose.Web\Authors\MikeRobbins.cs

.INPUTS
    None

.OUTPUTS
    System.String

.NOTES
    Author:  Mike F Robbins
    Website: http://mikefrobbins.com
    Twitter: @mikefrobbins
#>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$FirstName,

        [Parameter(Mandatory)]
        [string]$LastName,

        [string]$Bio,

        [string]$StateOrRegion,

        [string]$EmailAddress,

        [string]$TwitterHandle,

        [string]$GravatarEmailAddress,

        [string]$GitHubHandle,

        [Parameter(Mandatory)]
        [string]$BlogUri,

        [string]$RssUri,

        [switch]$MicrosoftMVP,

        [switch]$FilterToPowerShell
    )

    $BlogUrl = (Test-MrURL -Uri $BlogUri -Detailed).ResponseUri

    if ($PSBoundParameters.RssUri) {
        $RssUrl = (Test-MrURL -Uri $RssUri -Detailed).ResponseUri
    }

    $GravatarHash = (Get-MrHash -String $GravatarEmailAddress).ToLower()
    $Location = Get-MrGeoInformation
    $GeoLocation = -join ($Location.Latitude, ', ', $Location.Longitude)

    if ($MicrosoftMVP) {
        $Interface = 'IAmAMicrosoftMVP'
    }
    else {
        $Interface = 'IAmACommunityMember'
    }

    if ($FilterToPowerShell) {
        $Interface = "$Interface, IFilterMyBlogPosts"

        $SyndicationItem =
@'
public bool Filter(SyndicationItem item)
        {
            return item.Categories.Any(c => c.Name.ToLowerInvariant().Equals("powershell"));
        }
'@
    }

@"
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Syndication;
using System.Web;
using Firehose.Web.Infrastructure;
namespace Firehose.Web.Authors
{
    public class $FirstName$LastName : $Interface
    {
        public string FirstName => `"$FirstName`";
        public string LastName => `"$LastName`";
        public string ShortBioOrTagLine => `"$Bio`";
        public string StateOrRegion => `"$StateOrRegion`";
        public string EmailAddress => `"$EmailAddress`";
        public string TwitterHandle => `"$TwitterHandle`";
        public string GitHubHandle => `"$GitHubHandle`";
        public string GravatarHash => `"$GravatarHash`";
        public GeoPosition Position => new GeoPosition($GeoLocation);

        public Uri WebSite => new Uri(`"$BlogUrl`");
        public IEnumerable<Uri> FeedUris { get { yield return new Uri(`"$RssUrl`"); } }

        $SyndicationItem
    }
}
"@

}

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

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

New-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 |
New-Item -Path $LocalPath\src\Firehose.Web\Authors\$FirstName$LastName.cs

planet-powershell4d.png

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

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

planet-powershell6d.png

Add the class to the .csproj file:

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

planet-powershell5b.png

Verify the class has been added:

([xml](Get-Content -Path "$LocalPath\src\Firehose.Web\Firehose.Web.csproj")).Project.ItemGroup[2].Compile |
Where-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:

git 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:

git add .
git commit -m 'Added author information for Mike Robbins'
git 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.

ยต