Last month, we looked at the upcoming command shell from Microsoft called MSH (Microsoft Shell). It allows power users to utilize their machines and create new ways of managing the system better. Unlike other shells such as the DOS prompt or the Linux BASH prompt which uses procedural logic in any scripting, MSH uses a different methodology. Being built on managed code (read .NET), MSH uses a completely object-oriented philosophy as its base. Microsoft has invented a new language for scripting MSH. It uses a combination of familiar shell programming constructs from other standard shells as well as uses the OO concepts that are now inherent in this shell. MSH also has a concept of CmdLets (pronounced Command-Lets), equivalents of small commands, which can be combined to do more tasks. Let's look at how the new shell works. Every shell has a way to create variables that can be used in different ways. MSH follows the same idea. Here are some ways you can create different types of variables in
MSH.
MSH> $string = “Hello World”
MSH> $number = 3.141
MSH> $normalarray = 10,9,8,7,6,5
MSH> $associativerray = @{no = 0; yes = 1; maybe = 100}
MSH> echo $string
Hello World
MSH> echo $number
3.141
MSH> echo $normalarray
10
9
8
7
6
5
MSH> echo $associativearray
Key Value
--- -----
no 0
yes 1
maybe 100
|
Normal operation such as +,-,/,*,+=,-=,/=,*= are all allowed amongst variables. Of course, there are rules as to what will happen depending on the variables involved. However, the interesting part comes when you can start assigning data types to the variables. For instance, you can specify a set of different MSH data types as well as standard .NET types to the variables.
MSH>
MSH>
MSH>
MSH> $newyear = New-Object System.DateTime 2006,1,1
Since all variables in MSH are actually objects, normal variable value substitution becomes even more powerful than before. Take a look at the difference in the two examples below.
MSH> $folder = “C:\Windows”
MSH> dir $folder
Directory: FileSystem::C:\Windows
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- Apr 05 2004 64512 agrsmdel.exe
-a--- Oct 28 15:37 88363 agrsmmsg.exe
-a--- Aug 04 05:00 1272 Blue Lace 16.bmp
...
MSH> $process = Get-Process Notepad
MSH> echo $process.Name
Notepad.exe
In the second example, the variable '$process' is an object that contains different properties-one of them being 'Name'.
You can also access methods of the objects in MSH in the same manner. For instance, take a look at the examples that follow.
MSH> $str = “My name is Anthony Gonzalves”
MSH> echo $str.SubString(11, 3)
Ant
MSH> echo $str.ToUpper()
MY NAME IS ANTHONY GONZALVES
MSH> echo $str.StartsWith(“Test”)
False
MSH> echo $str.StartsWith(“My”)
True
MSH> echo $str.Split(“ ”)
My
name
is
Anthony
Gonzalves
You can even call static methods on the data type by prepending the method with '
MSH>
-1
MSH>
08/17/2005
Finally, you can create functions that let you perform a particular task in the following manner. These functions can be written at the command line (valid for that session) or put within an .MSH file (like a .sh or .bat file).
MSH> function percentage {
>> $value = $args<0> * 100 / $args<1>
>> $result = “The percentage is: “ + $value + “%”
>> }
MSH> percentage 50 100
The percentage is: 50%
You can also specify the parameters that a function should have, with their data type and their optional defaults. For instance,
MSH> function area {
>> param (
>> $result = $length * $width * $height
>> “The area is: ” + $result.ToString()}
MSH> area
The area is: 0
MSH> area 5, 10, 15
The area is: 750
Thus, an object oriented powerful programming model for the new MSH lets you create scripts and functions that can work with the entire .NET object model at the command line itself. It is surmised that this new shell will be released for Win XP and higher after the release of Windows Vista. It will also be one of the new remote-management options for the next version of MS Exchange.
Vinod Unny, Enterprise Infotech