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:
Forking a repository creates your own personal copy of it underneath your GitHub account as denoted by #1 in the following image:
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
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'
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
Verify that the contents of the .cs file looks correct:
1Get-Content -Path $LocalPath\src\Firehose.Web\Authors\$FirstName$LastName.cs
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")
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*
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
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
Submit a pull request:
Click the "Create pull request button":
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.
µ