Archive for November, 2005

phonebook, a simple msh script

Thursday, November 24th, 2005

I spend a lot of time on the command line while I am programming. Most of the time is running ant/Nant and Junit/nunit scripts to compile and then test what I have written. Here is a small script to act as a quick phone book. I have written it in many languages over the years as hello-world script because it addresses some common features you will have to implement if you are trying to create something which will do something useful. This script addresses the following features:

  • Input parameters
  • user defined function
  • matching input
  • creating user defined data structures

Although the data structure used for the phonebook is a Hashtable, it could have been an XML file. In fact the advantage of using the XML file is that you would not have to keep signing the script as you modify it to add entries.

Here is the script:

# msh script to be phonebook lookup

function GetNumber
{
    param([string]$name)
    $name = $name.ToLower()
    $number = $book.get_Item($name)
    if ($number -eq $null )
    {
        $name = "*$name*"
        # break the name up and search individual
        foreach ($k in $book.Keys)
        {
           if ($k -like $name)
           {
              $number = $book.get_Item($k)
              break
           }
        }
    }
    else
    {
       write-host "Number is not null"
       if ($number.ToString().Length -eq 0)
       {
           write-host "length is zero"
       }
    }

    $number
}

# Create the book and seed with values.
$book = new-object System.Collections.Hashtable
$book.Add("dan mckinley", "38740")
$book.Add("darrel herbst", "38744")

if (($Args).Length -eq 0)
{
    write-host "Usage: phone.msh name [name ...]"
    exit 1
}

write-host
foreach ($name in $Args)
{
    # if no exact match, then look for partial matches
    $result  = GetNumber $name

    write-host $name "-->" $result
}
write-host

a better life through lisp

Monday, November 21st, 2005

I have been using emacs as my favorite text editor for over fifteen years. One of the super nifty features is that you can just throw some lisp into a buffer and jam C-x eval-buffer (that’s Control-x and then type “eval-buffer”) and the lisp program you just wrote executes. I currently prefer doing this to writing windows scripting host or bash scripts to generate sql statements. Though I might have to install monad and start playing around with the msh scripting environment. Example below:

(with-output-to-temp-buffer “*script-output*”

  (setq id 1)

  (setq states ‘(“ALABAMA” “ALASKA” “AMERICAN SAMOA” “ARIZONA” “ARKANSAS” “CALIFORNIA” “COLORADO” “CONNECTICUT” “DELAWARE” “DISTRICT OF COLUMBIA”
“FEDERATED STATES OF MICRONESIA” “FLORIDA” “GEORGIA” “GUAM” “HAWAII” “IDAHO” “ILLINOIS” “INDIANA” “IOWA” “KANSAS” “KENTUCKY” “LOUISIANA” “MAINE”
“MARSHALL ISLANDS” “MARYLAND” “MASSACHUSETTS” “MICHIGAN” “MINNESOTA” “MISSISSIPPI” “MISSOURI” “MONTANA” “NEBRASKA” “NEVADA” “NEW HAMPSHIRE”
“NEW JERSEY” “NEW MEXICO” “NEW YORK” “NORTH CAROLINA” “NORTH DAKOTA” “NORTHERN MARIANA ISLANDS” “OHIO” “OKLAHOMA” “OREGON” “PALAU” “PENNSYLVANIA”
“PUERTO RICO” “RHODE ISLAND” “SOUTH CAROLINA” “SOUTH DAKOTA” “TENNESSEE”
“TEXAS” “UTAH” “VERMONT” “VIRGIN ISLANDS” “VIRGINIA” “WASHINGTON” “WEST VIRGINIA” “WISCONSIN” “WYOMING”))

  (setq abbr ‘(“AL” “AK” “AS” “AZ” “AR” “CA” “CO” “CT” “DE” “DC”
“FM” “FL” “GA” “GU” “HI” “ID” “IL” “IN” “IA” “KS” “KY” “LA” “ME”
“MH” “MD” “MA” “MI” “MN” “MS” “MO” “MT” “NE” “NV” “NH”
“NJ” “NM” “NY” “NC” “ND” “MP” “OH” “OK” “OR” “PW” “PA”
“PR” “RI” “SC” “SD” “TN” “TX”
“UT” “VT” “VI” “VA” “WA” “WV” “WI” “WY”))

  (while states

    (setq currentstate (car states))

    (setq ab (car abbr))

    (princ (format “INSERT INTO State (stateId, stateName, abbreviation) values (%d, ‘%s’, ‘%s’)” id currentstate ab))

    (setq states (cdr states))

    (setq abbr (cdr abbr))

    (setq id (1+ id))

  )

)

And the output:

INSERT INTO State (stateId, stateName, abbreviation) values (1, ‘ALABAMA’, ‘AL’)

INSERT INTO State (stateId, stateName, abbreviation) values (2, ‘ALASKA’, ‘AK’)

INSERT INTO State (stateId, stateName, abbreviation) values (3, ‘AMERICAN SAMOA’, ‘AS’)

INSERT INTO State (stateId, stateName, abbreviation) values (4, ‘ARIZONA’, ‘AZ’)

INSERT INTO State (stateId, stateName, abbreviation) values (5, ‘ARKANSAS’, ‘AR’)

INSERT INTO State (stateId, stateName, abbreviation) values (6, ‘CALIFORNIA’, ‘CA’)

INSERT INTO State (stateId, stateName, abbreviation) values (7, ‘COLORADO’, ‘CO’)

INSERT INTO State (stateId, stateName, abbreviation) values (8, ‘CONNECTICUT’, ‘CT’)

INSERT INTO State (stateId, stateName, abbreviation) values (9, ‘DELAWARE’, ‘DE’)

INSERT INTO State (stateId, stateName, abbreviation) values (10, ‘DISTRICT OF COLUMBIA’, ‘DC’)

INSERT INTO State (stateId, stateName, abbreviation) values (11, ‘FEDERATED STATES OF MICRONESIA’, ‘FM’)

INSERT INTO State (stateId, stateName, abbreviation) values (12, ‘FLORIDA’, ‘FL’)

INSERT INTO State (stateId, stateName, abbreviation) values (13, ‘GEORGIA’, ‘GA’)

INSERT INTO State (stateId, stateName, abbreviation) values (14, ‘GUAM’, ‘GU’)

INSERT INTO State (stateId, stateName, abbreviation) values (15, ‘HAWAII’, ‘HI’)

INSERT INTO State (stateId, stateName, abbreviation) values (16, ‘IDAHO’, ‘ID’)

INSERT INTO State (stateId, stateName, abbreviation) values (17, ‘ILLINOIS’, ‘IL’)

INSERT INTO State (stateId, stateName, abbreviation) values (18, ‘INDIANA’, ‘IN’)

INSERT INTO State (stateId, stateName, abbreviation) values (19, ‘IOWA’, ‘IA’)

INSERT INTO State (stateId, stateName, abbreviation) values (20, ‘KANSAS’, ‘KS’)

INSERT INTO State (stateId, stateName, abbreviation) values (21, ‘KENTUCKY’, ‘KY’)

INSERT INTO State (stateId, stateName, abbreviation) values (22, ‘LOUISIANA’, ‘LA’)

INSERT INTO State (stateId, stateName, abbreviation) values (23, ‘MAINE’, ‘ME’)

INSERT INTO State (stateId, stateName, abbreviation) values (24, ‘MARSHALL ISLANDS’, ‘MH’)

INSERT INTO State (stateId, stateName, abbreviation) values (25, ‘MARYLAND’, ‘MD’)

INSERT INTO State (stateId, stateName, abbreviation) values (26, ‘MASSACHUSETTS’, ‘MA’)

INSERT INTO State (stateId, stateName, abbreviation) values (27, ‘MICHIGAN’, ‘MI’)

INSERT INTO State (stateId, stateName, abbreviation) values (28, ‘MINNESOTA’, ‘MN’)

INSERT INTO State (stateId, stateName, abbreviation) values (29, ‘MISSISSIPPI’, ‘MS’)

INSERT INTO State (stateId, stateName, abbreviation) values (30, ‘MISSOURI’, ‘MO’)

INSERT INTO State (stateId, stateName, abbreviation) values (31, ‘MONTANA’, ‘MT’)

INSERT INTO State (stateId, stateName, abbreviation) values (32, ‘NEBRASKA’, ‘NE’)

INSERT INTO State (stateId, stateName, abbreviation) values (33, ‘NEVADA’, ‘NV’)

INSERT INTO State (stateId, stateName, abbreviation) values (34, ‘NEW HAMPSHIRE’, ‘NH’)

INSERT INTO State (stateId, stateName, abbreviation) values (35, ‘NEW JERSEY’, ‘NJ’)

INSERT INTO State (stateId, stateName, abbreviation) values (36, ‘NEW MEXICO’, ‘NM’)

INSERT INTO State (stateId, stateName, abbreviation) values (37, ‘NEW YORK’, ‘NY’)

INSERT INTO State (stateId, stateName, abbreviation) values (38, ‘NORTH CAROLINA’, ‘NC’)

INSERT INTO State (stateId, stateName, abbreviation) values (39, ‘NORTH DAKOTA’, ‘ND’)

INSERT INTO State (stateId, stateName, abbreviation) values (40, ‘NORTHERN MARIANA ISLANDS’, ‘MP’)

INSERT INTO State (stateId, stateName, abbreviation) values (41, ‘OHIO’, ‘OH’)

INSERT INTO State (stateId, stateName, abbreviation) values (42, ‘OKLAHOMA’, ‘OK’)

INSERT INTO State (stateId, stateName, abbreviation) values (43, ‘OREGON’, ‘OR’)

INSERT INTO State (stateId, stateName, abbreviation) values (44, ‘PALAU’, ‘PW’)

INSERT INTO State (stateId, stateName, abbreviation) values (45, ‘PENNSYLVANIA’, ‘PA’)

INSERT INTO State (stateId, stateName, abbreviation) values (46, ‘PUERTO RICO’, ‘PR’)

INSERT INTO State (stateId, stateName, abbreviation) values (47, ‘RHODE ISLAND’, ‘RI’)

INSERT INTO State (stateId, stateName, abbreviation) values (48, ‘SOUTH CAROLINA’, ‘SC’)

INSERT INTO State (stateId, stateName, abbreviation) values (49, ‘SOUTH DAKOTA’, ‘SD’)

INSERT INTO State (stateId, stateName, abbreviation) values (50, ‘TENNESSEE’, ‘TN’)

INSERT INTO State (stateId, stateName, abbreviation) values (51, ‘TEXAS’, ‘TX’)

INSERT INTO State (stateId, stateName, abbreviation) values (52, ‘UTAH’, ‘UT’)

INSERT INTO State (stateId, stateName, abbreviation) values (53, ‘VERMONT’, ‘VT’)

INSERT INTO State (stateId, stateName, abbreviation) values (54, ‘VIRGIN ISLANDS’, ‘VI’)

INSERT INTO State (stateId, stateName, abbreviation) values (55, ‘VIRGINIA’, ‘VA’)

INSERT INTO State (stateId, stateName, abbreviation) values (56, ‘WASHINGTON’, ‘WA’)

INSERT INTO State (stateId, stateName, abbreviation) values (57, ‘WEST VIRGINIA’, ‘WV’)

INSERT INTO State (stateId, stateName, abbreviation) values (58, ‘WISCONSIN’, ‘WI’)

INSERT INTO State (stateId, stateName, abbreviation) values (59, ‘WYOMING’, ‘WY’)

Getting started with Monad (msh)

Saturday, November 12th, 2005

Some steps to get started with Monad (aka msh) the new Microsoft command shell:

You can download it from microsoft on the Monad Beta 2 page.

One of the things you will want to do is to change the execution policy so that you can write your own .msh files and run them. Run the following from the msh command line:

set-property HKLM:\SOFTWARE\Microsoft\Msh\Microsoft.Management.Automation.msh -property ExecutionPolicy -value RemoteSigned

This allows you to execute scripts on your computer, but ones which are downloaded from Outlook or Internet Explorer will be required to be signed to run. More on how to sign your scripts in following posts.I immediately needed to customize the shell for the way I like to work. There are a functions and customizations I generally put into my .bashrc scripts whenever I get an account on a system. To do your customizations with msh, create a “MSH” directory in “My Documents” and place them in “profile.msh” in that directory. The file should be located here:

c:\Documents and Settings\your username\My Documents\MSH\profile.msh

For example, you can customize the prompt by putting a function definition for ‘prompt’ into the profile.msh file like this:

function prompt
{
“msh$ ”
}