My cat woke me up extremely early this Saturday morning with the incessant meowing and carpet-scratching that signals either her boredom, or an empty food dish.
So I got up, made some coffee, put some meat crackers into kitty's bowl, and then started tinkering with my Powershell profile... now it looks like this every time I launch PS:
It all started a couple weeks ago when I watched a Channel9 video where Jeffrey Snover was playing with Powershell, and I noticed that he had changed his error text color to green. I'm guessing like so:
$Host.PrivateData.ErrorForegroundColor = "Green"
I don't know why he configured his error messages to be green. Maybe it's just because it's easier to see than the default red. But I like to imagine the idea is to promote positive feedback... like elementary school teachers marking their student's incorrect homework answers with another color of pen besides a red pen... because red ink makes the kids feel bad.
Anyway, as I started playing with text colors and title bar text and whatnot, it occured to me that all these settings would just revert to defaults after I closed this Powershell session. So how do we make such changes permanent?
The Powershell Profile!
Just type $Profile into Powershell right now, and it will tell you the full path of your very own PS profile. It should be something like this:
That script gets executed first thing every time you launch PS. It may not exist yet - you have to create it. Just type Notepad $Profile and Notepad will open that file up, or prompt you to create it if it doesn't already exist.
I'm still thinking of more neat gizmos to throw in here, but this is good for now. The weather information comes from the Yahoo Weather web API, and the ServerFault rep information comes from the StackExchange API. *Swoon...* REST APIs are so dreamy...
The StackExchange API gives you 300 anonymous calls per day per IP (more if you authenticate.) There is a basic amount of error handling so that if you can't connect to one or the other of the web APIs to get the data for whatever reason, it will just replace the appropriate string with [Error connecting to weather API], and so on. You'd want to put a short timeout on the API calls too... Powershell doesn't need any help being slow to load!
And without further ado, here's the code:
Set-StrictMode -Version Latest
[String]$WOEID = "2355944" # Where on earth ID for Arlington TX
[String]$WelcomeName = "Ryan"
[Xml]$WeatherAPIResponse = $Null
$StackExAPIResponse = $Null
[String]$WelcomeBanner = [String]::Empty
[String]$WeatherString = [String]::Empty
[String]$StackExString = [String]::Empty
$WeatherAPIResponse = Invoke-WebRequest http://weather.yahooapis.com/forecastrss?w=$WOEID -TimeoutSec 3 -ErrorAction Stop
If($WeatherAPIResponse -NE $Null -AND $WeatherAPIResponse.PSObject.Properties.Match('rss').Count)
$WeatherString = "Current weather in $($WeatherAPIResponse.rss.channel.location.city), $($WeatherAPIResponse.rss.channel.location.Region): $($WeatherAPIResponse.rss.channel.item.condition.temp)°, $($WeatherAPIResponse.rss.channel.item.condition.text), $($WeatherAPIResponse.rss.channel.atmosphere.humidity)% humidity"
$WeatherString = "[Error connecting to weather service.]"
$StackExAPIResponse = Invoke-WebRequest https://api.stackexchange.com/users/104624?site=serverfault -TimeoutSec 3 -ErrorAction Stop
If($StackExAPIResponse -NE $Null -AND $StackExAPIResponse.PSObject.Properties.Match('Content'))
$StackExString = "Current ServerFault rep: $($(ConvertFrom-Json $StackExAPIResponse.Content).Items.Reputation) total, $($(ConvertFrom-Json $StackExAPIResponse.Content).Items.reputation_change_day) today, $($(ConvertFrom-Json $StackExAPIResponse.Content).Items.reputation_change_week) this week"
$StackExString = "[Error connecting to StackExchange. ]"
$WelcomeBanner = @"
.ooooooo Welcome back, $WelcomeName!
ooooo ooooo $StackExString
ooo .o. ooooo
oo oo ooo
.oo myotherpcisacloud.com oo
Write-Host $WelcomeBanner -ForegroundColor Cyan