Fortune is a Unix command that gets a random message from a set of databases and displays it on the screen.  These messages have a wide variety but tend to be funny, quirky or famous quotes (most are indeed geeky). 

Nearly all unix systems have a version of Fortune.  Windows doesn't have any version by default.  It provides no real functionality other than humor and amusement but it's something I miss.  Most users add it to their .profile script so they get a new fortune every time they log in.

There are a couple of heavy weight options to get fortune on my machine  but I prefer something a bit lighter.  I did a quick search and discovered that Doug Hughes implemented a fortune web service.  This is just above as light weight as it gets so I implemented a simple PSCmdlet, get-fortune, to do the work (code below).

Now I can just add a quick get-fortune to my profile script.

C:\Users\jaredp> get-fortune pets
Does the name Pavlov ring a bell?

<Cmdlet(VerbsCommon.Get, "Fortune")> _
Public Class GetFortune
    Inherits PSCmdlet

    Public Const TopicHelpMessage = "Restricts fortune output to the specified topic"

    Private m_topic As String = String.Empty
    Private m_minimumLength As Integer
    Private m_maximumLength As Integer
    Private m_timeout As Integer = 100000

    <Parameter( _
               Position:=0, _
               HelpMessage:=TopicHelpMessage, _
               ValueFromPipeline:=True, _
               ValueFromPipelineByPropertyName:=True)> _
    Public Property Topic() As String
        Get
            Return m_topic
        End Get
        Set(ByVal value As String)
            m_topic = value
        End Set
    End Property

    <Parameter(Position:=1)> _
    Public Property MinimumLength() As Integer
        Get
            Return m_minimumLength
        End Get
        Set(ByVal value As Integer)
            m_minimumLength = value
        End Set
    End Property

    <Parameter(Position:=2)> _
    Public Property MaximumLength() As Integer
        Get
            Return m_maximumLength
        End Get
        Set(ByVal value As Integer)
            m_maximumLength = value
        End Set
    End Property

    <Parameter(Position:=3)> _
    Public Property Timeout() As Integer
        Get
            Return m_timeout
        End Get
        Set(ByVal value As Integer)
            m_timeout = value
        End Set
    End Property

    Protected Overrides Sub ProcessRecord()
        Dim proxy As New DougHughes.fortune
        Dim topic = m_topic
        If topic Is Nothing Then
            topic = String.Empty
        End If

        proxy.Timeout = m_timeout
        WriteObject(proxy.getFortune(topic, m_minimumLength, m_maximumLength))
    End Sub

End Class