Regain your sanity – a tale of Console2 and Powershell goodness

by DotNetNerd 19. December 2012 16:29

For some time I have grown weary by the ever increasing number of consoles and one-feature-applications I end up using during a work day. The good thing about being a developer is that it is my own fault, because I can just choose to do something about it - and so I did.

First step was based on two blogposts from Scott Hanselman that I remembered reading; "Console2 - A Better Windows Command Prompt" and "Awesome Visual Studio Command Prompt and PowerShell icons with Overlays". Those two posts gave me a place to start so I could get rid of seperate icons on my desktop for cmd, Visual Studio cmd, Powershell, MongoDb, Ryby, Python, Node, Clojure etc. Basically I can now use Powershell with the capabilities of the Visual Studio Command prompt, and have the rest open in other tabs in Console2.

Of course I made a few tweaks of my own, but all credit goes to Scott for a great blogpost. Only thing I was disliking was choosing the kermit green foreground color, because it overrides coloring of eg. error messages.

Second step was reducing the number of one-feature-applications and long cryptic commands that I had to remember or keep in Evernote, .txt files, .bat files and so on. This turned out to be easy by using my profile in Powershell to store functions.

New-Item -ItemType File -Path $profile -Force
notepad $profile

In my profile I can make naming conventions that make sence and I can wrap more complex operations in easilly discoverable functions utilizing Powershells tab-completion. I can replace small tools and scripts for doing xslt transforms, builds, migrations, remote iis resets, deployment to my development machine and so on. What these tools do often turns out to be the equivalent of a few lines of powershell. Mostly something along the lines of this sample, which runs a nant script that does database migrations.

function Invoke-MyProjectMigrate([string]$version)
{
    Set-Location $path
    if ($version -eq "") {
        .\nant.bat /f:nant.DbMigrations.build db.resources.migrate
    }
    else {
        &{.\nant.bat /f:nant.DbMigrations.build db.resources.migrate /D:migration.version=$version }
    }   
}

After a while I wanted to put my functions into modules, so I could package them up, and have a set of functions for each project I work on. To do this I simply moved my functions into separate files, that I put in my d:\Scripts folder. Then my profile simply imports all modules from that folder.

Get-ChildItem D:\Scripts | Foreach-Object {
    Import-Module D:\Scripts/$_
}

With this in place a have a very simple, lightweight and extensible way of improving my tooling as I go. I can also use Posh-Git/Posh-Hg for version control, and if I need to get more structure at some point I will turn to PSake. In case you don't already know PSake is the Powershell version of make, rake, bake or cake. Simply put it provides a way to do build scripts with interdependent steps. So by now I am starting to feel pretty good about my tooling, and I have been able to remove a lot of clutter from my daily life.

For now my setup is very self-centered, because I use full paths to where I put stuff, but going forward it will probably be generalized and checked into version control for everyone to enjoy.

Who am I?

My name is Christian Holm Diget, and I work as an independent consultant, in Denmark, where I write code, give advice on architecture and help with training. On the side I get to do a bit of speaking and help with miscellaneous community events.

Some of my primary focus areas are code quality, programming languages and using new technologies to provide value.

Microsoft Certified Professional Developer

Microsoft Most Valuable Professional

Month List