<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Monad</title><link>http://blogs.msdn.com/monad/default.aspx</link><description>Monad Technology Blog</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Please point your RSS readers to http://blogs.msdn.com/PowerShell/</title><link>http://blogs.msdn.com/monad/archive/2006/04/25/583360.aspx</link><pubDate>Tue, 25 Apr 2006 20:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:583360</guid><dc:creator>Monad Team</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/monad/comments/583360.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=583360</wfw:commentRss><description>&lt;P&gt;Along with our new name comes a new team blog: &lt;A HREF="/PowerShell/"&gt;http://blogs.msdn.com/PowerShell/&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Please subscribe to that blog instead -- as this blog will now go dark.&lt;/P&gt;
&lt;P&gt;Lee&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=583360" width="1" height="1"&gt;</description></item><item><title>Windows PowerShell (Monad) Has Arrived</title><link>http://blogs.msdn.com/monad/archive/2006/04/25/583333.aspx</link><pubDate>Tue, 25 Apr 2006 19:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:583333</guid><dc:creator>Monad Team</dc:creator><slash:comments>39</slash:comments><comments>http://blogs.msdn.com/monad/comments/583333.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=583333</wfw:commentRss><description>&lt;P&gt;I just got out of Bob Muglia's keynote speech where he formally announced Windows PowerShell (previously known as Monad).&amp;nbsp; The key things he announced are:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Monad (MSH) has a new name: Windows PowerShell 
&lt;LI&gt;Windows PowerShell will RTW (Web download) in Q4 2006 
&lt;LI&gt;RC1 of Windows PowerShell is available today 
&lt;LI&gt;Exchange 2007 and MOM will be built upon Windows PowerShell 
&lt;LI&gt;The next wave of products will be leverage the same architecture - Admin GUI layered on Windows PowerShell&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Superstar Vivek Sharma demonstrated the Exchange 2007 Admin experience. First he showed their new MMC 3.0 managed code snap-in - it totally rocks! (you'll be amazed by what you can do with MMC 3.0).&amp;nbsp;&amp;nbsp; He showed an example of adding a distribution list using the GUI.&amp;nbsp; At the end of this wizard, it showed the results of the operation and the Command equivalent.&amp;nbsp; This highlighted the fact that the Exchange GUI is layered on top of PowerShell meaning that there is parity between the GUI and the CLI and that the GUI helps teach the CLI.&amp;nbsp; He then opened a PowerShell window and typed the Cmdlet name using tab-completion and hit enter, this then prompted him for all the necessary information to complete the task showing you PowerShell helps guide the user to successful complete the task.&amp;nbsp; He then showned a number of features of the Exchange cmdlets highlighting the ability to safely manage a large number of objects in a single command line.&amp;nbsp; He concluded by showing a command sequence which leveraged a Exchange 2007 cmdlet piped to a Monad Cmdlet piped to a Community script to generate a graphical chart report of Exchange data.&amp;nbsp; It was a very cool demo and was&amp;nbsp;very well received.&lt;/P&gt;
&lt;P&gt;Here are the ramifications of this announcement:&lt;BR&gt;&lt;STRONG&gt;Windows PowerShell is real and you can count on it shipping.&amp;nbsp; &lt;/STRONG&gt;Most of you already knew that but some people just won't talk to you until you have a ship date and ship vehicle.&amp;nbsp; We have those now. Everyone can start making concrete plans for how and when you'll support, leverage and/or use Windows PowerShell.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Windows PowerShell is ready for the big leagues.&lt;/STRONG&gt;&amp;nbsp; Exchange 2007 is a major league, high volume, high stress, production application and it is using Windows PowerShell as the core for its entire admin experience.&amp;nbsp; We have worked closely with that team to ensure that Windows PowerShell V1.0 has the features and quality necessary to make that a safe bet.&amp;nbsp; Exchange has been hardcore about the functional and operation requirements of their customers.&amp;nbsp; This has driven PowerShell and resulted in an unusually&amp;nbsp;robust and functional V1.0 release.&amp;nbsp; You too can expose your admin experience via Windows PowerShell and deliver your customer's an awesome admin experience. If you are an admin, you should start asking your vendors when they'll support PowerShell.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;You can use RC1 of Windows PowerShell today.&lt;/STRONG&gt;&amp;nbsp; RC1 is in great shape.&amp;nbsp; We changed the name of the exe to PowerShell.exe and the extension is now .PS1 .&amp;nbsp; We also did a big consistency pass on the cmdlets and their parameters make a number of changes along with those required to support the new name.&amp;nbsp; We release that this means that you'll have to relearn some commands and perhaps rework some scripts - apologizes for that but in the long turn, these changes really improve the consistency of the surface - a virtue that will pay back year and year.&amp;nbsp; There are also a number of bug fixes and a few DCRs.&amp;nbsp; The one you'll all go goo-goo over is Tab Completion.&amp;nbsp; You can now Tab-Complete command names, parameter names, filenames, and variable properties/methods.&amp;nbsp; Tab-Completion is now a user-definable function so if you don't like our implementation, you can replace it with one of your choosing.&amp;nbsp; Pick up RC1 today.&amp;nbsp; Here are the links:&lt;BR&gt;- X86 Windows PowerShell latest build: &lt;A href="http://go.microsoft.com/fwlink/?linkid=64772&amp;amp;clcid=0x409"&gt;http://go.microsoft.com/fwlink/?linkid=64772&amp;amp;clcid=0x409&lt;/A&gt; &lt;BR&gt;- X64 Windows PowerShell latest build: &lt;A href="http://go.microsoft.com/fwlink/?linkid=64773&amp;amp;clcid=0x409"&gt;http://go.microsoft.com/fwlink/?linkid=64773&amp;amp;clcid=0x409&lt;/A&gt;&amp;nbsp; &lt;BR&gt;- Windows PowerShell documentation: &lt;A href="http://go.microsoft.com/fwlink/?linkid=64774&amp;amp;clcid=0x409"&gt;http://go.microsoft.com/fwlink/?linkid=64774&amp;amp;clcid=0x409&lt;/A&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Side Note:&amp;nbsp; The names of many of the APIs have changed to reflect the new name (basically you'll have to search and replace MSH with PS).&amp;nbsp; We're sorry about the inconvenience of this, we always expected the official name to be the Microsoft Shell or Management Shell so we felt confident that MSH was safe to use.&amp;nbsp; When Marketing saw what the technology actually did and the incredibly positive reaction that customers and partners, they decided that we warranted a "Marquee" name (I'm not making this up). Marquee names are given to those features that are going to be emphasized during the Marketing push.&amp;nbsp; So here is the net of all that: the downside is that you've got to change your API calls, the upside is that you are leveraging a technology that Microsoft Marketing plans to feature widely.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We have a new blog site to befit our new name: &amp;nbsp;&lt;A href="/powershell/default.aspx"&gt;http://blogs.msdn.com/powershell/default.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This is a pretty big day for the community.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Enjoy!&lt;BR&gt;jps&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=583333" width="1" height="1"&gt;</description></item><item><title>Exposing the Power of .NET in a Admin-friendly way</title><link>http://blogs.msdn.com/monad/archive/2006/04/24/582155.aspx</link><pubDate>Mon, 24 Apr 2006 16:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:582155</guid><dc:creator>Monad Team</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/monad/comments/582155.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=582155</wfw:commentRss><description>&lt;P&gt;One of our primary goals for Monad was to: &lt;EM&gt;&amp;nbsp;"Expose the power of .NET in an Admin-friendly way"&lt;/EM&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The challenges of systems administration are large and growing at the same time organizations are under ever more pressure to reduce costs and do more with less.&amp;nbsp; That was true 10 years ago, it is true now, it will be true 10 years from now.&lt;/P&gt;
&lt;P&gt;One of the key strategies for dealing with this is leverage the power of communities by&amp;nbsp;participating in user/news groups where you can give and get help and share scripts for solving problems.&amp;nbsp; As such, we wanted an environment that provided the widest possible dynamic range so that a large and diverse community of users could come together and help one another.&amp;nbsp; Monad is designed to meet the needs of admins, beginning scripters, advanced scripters and programmers. The other benefit of this approach is that it allows people to start off as admins and migrate to whatever level of programming they want to.&amp;nbsp; I fully expect Monad to be the vector that some Admins will use to make a career change into software engineering.&amp;nbsp; I also expect things to go in the other direction as well as is the case in Unix environments where the line between programmers and admins can get quite fuzzy.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Here is how you should think about this issue:&amp;nbsp; Most programs/scripts perform 3 activities:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Get Objects&lt;/LI&gt;
&lt;LI&gt;Process Objects&lt;/LI&gt;
&lt;LI&gt;Generate Output&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;For each of these areas, Monad provides 3 modes of access along a spectrum of Programmer-Oriented to Admin-Oriented.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Raw .NET access&lt;/LI&gt;
&lt;LI&gt;Enhanced .NET access&lt;/LI&gt;
&lt;LI&gt;Command access&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Monad provides a sort of Rubic's cube model where you can choose whatever access mode you want for whatever activity you want.&amp;nbsp; You can use Raw .NET access to get objects, enhanced .NET access to process those objects and then Command access to generate output.&amp;nbsp; I won't go through all the combinations but you see what I'm getting at? You can do everything at one mode or mix and match to your hearts content.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Raw .Net Access&lt;/U&gt;&lt;BR&gt;&lt;/STRONG&gt;Monad allows you to write programs that get/process/output raw .net objects just like any other .NET language.&amp;nbsp; Here is an example written in C# and then in Monad:&lt;BR&gt;&lt;STRONG&gt;C#&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; &lt;FONT face="Courier New" size=1&gt;Process myProcess = new Process();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp; try&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string myDocumentsPath = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Environment.GetFolderPath(Environment.SpecialFolder.Personal);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myProcess.StartInfo.FileName = myDocumentsPath + "&lt;/FONT&gt;&lt;A href="file://myfile.doc/"&gt;&lt;FONT face="Courier New" size=1&gt;\\MyFile.doc&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=1&gt;"; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myProcess.StartInfo.Verb = "Print";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myProcess.StartInfo.CreateNoWindow = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myProcess.Start();&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; catch (ComponentModel.Win32Exception e)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(e.Message + ". Check the path.");&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;Monad&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp; &lt;FONT face="Courier New" size=1&gt;[System.Diagnostics.Process]$myProcess = new-object System.Diagnostics.Process;&lt;BR&gt;&amp;nbsp; trap [ComponentModel.Win32Exception] {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Console]::WriteLine("Error: " + $_.Error);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; $myDocumentsPath = [Environment]::GetFolderPath("Personal");&lt;BR&gt;&amp;nbsp; $myProcess.StartInfo.FileName = $myDocumentsPath + "&lt;/FONT&gt;&lt;A href="file://myfile.doc/"&gt;&lt;FONT face="Courier New" size=1&gt;\\MyFile.Doc&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=1&gt;";&lt;BR&gt;&amp;nbsp; $myProcess.StartInfo.Verb = "Print";&lt;BR&gt;&amp;nbsp; $myProcess.StartInfo.CreateNoWindow = $true;&lt;BR&gt;&amp;nbsp; $myProcess.Start()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;That is a small code fragment but you'll see the same thing if you use a larger program, you can pretty much code C# or VB.NET using Monad (in the same way you can code Fortan using C and C using C++).&amp;nbsp; That is great but if you just wanted to raw .NET access, you are probably better off just using C# or VB.Net.&amp;nbsp; Monad provides raw .NET access to establish a rockbed of function that ensures that you'll always be able to get the job done.&amp;nbsp; If you are coding at a higher level and the function you need is not available, you don't have to throw away your work and start over, you can always access the raw .NET layer and do anything.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Anyone that has done scripting for very long&amp;nbsp;knows exactly what I mean - there are always times when you need to turn the dial to 11 and when you can't - the situation turns gruesome quickly.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Enhanced .NET access&lt;BR&gt;&lt;/STRONG&gt;&lt;/U&gt;Monad provides gobs of features that enhance and simplify the access to .NET.&amp;nbsp; I'm sure that entire books will be dedicated to just this one topic so I can't hope to do much here beyond giving a few examples.&lt;/P&gt;
&lt;P&gt;In the area of enhancing getting objects, Monad has a number of accelerators for supporting object types widely used in scripting like [xml], [array], [regex], [scriptblock], [hashtable] (in addition to the obvious ones like [int], [string], [double], etc).&amp;nbsp; In addition to syntactic support for creating these types of objects, Monad has a number of built in conversion rules which simplify getting the object you need when you need it.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Monad's synthetic type system also makes it easier to get objects than raw .NET access.&amp;nbsp; This is used to normalize object naming (e.g. Monad provides the NAME property alias for process which maps to PROCESSNAME and ServiceController which maps to SERVICENAME).&amp;nbsp; This is also used to increase the granularity/usefulness of raw .NET objects.&amp;nbsp; For instance on the Process object, we add the properties DESCRIPTION, FILEVERSION, PRODUCT, and PRODUCTVERSION.&amp;nbsp; All of these properties are available from the process object but to get them you have to navigate through the MainModule.FileVersionInfo path.&amp;nbsp; i.e.&lt;BR&gt;&amp;nbsp;$p.PRODUCTVERSION == $p.MainModule.FileVersionInfo.PRODUCTVERSION&lt;BR&gt;Another way of saying this is that .NET objects are often designed for the needs of Programmers not Admins and Monad has capabilities to tweak those objects so they meet the needs of Admins.&lt;/P&gt;
&lt;P&gt;Monad enhances .NET objects to make it easier to process those objects as well.&amp;nbsp; Take the following simple expression which tells you how long until Christmas (My daughter's favorite question).&amp;nbsp; Let's make it a little more precise since what she really cares about is when she can open presents and we've established a firm rule that the kids have to stay in bed until at least 7am on Christmas (established after the 4am wake up incident).&amp;nbsp; Here is the code I run whenever she asks that question:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; [DateTime]"12/25/2006 7:00" - [DateTime]::now&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Days&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 245&lt;BR&gt;Hours&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 11&lt;BR&gt;Minutes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4&lt;BR&gt;Seconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 11&lt;BR&gt;Milliseconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 359&lt;BR&gt;Ticks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 212078513593750&lt;BR&gt;TotalDays&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 245.461242585359&lt;BR&gt;TotalHours&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 5891.06982204861&lt;BR&gt;TotalMinutes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 353464.189322917&lt;BR&gt;TotalSeconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 21207851.359375&lt;BR&gt;TotalMilliseconds : 21207851359.375&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This is possible because many .NET types can manipulate strings to create types.&amp;nbsp; This is an example of where leveraging .NET makes it dramatically easier for Admins to do hard things.&amp;nbsp; In this case, DateTime takes that string and makes the following data available:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; [DateTime]"12/25/2006 7:00" |fl *&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;DateTime&amp;nbsp;&amp;nbsp;&amp;nbsp; : Monday, December 25, 2006 7:00:00 AM&lt;BR&gt;Date&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 12/25/2006 12:00:00 AM&lt;BR&gt;Day&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 25&lt;BR&gt;DayOfWeek&amp;nbsp;&amp;nbsp; : Monday&lt;BR&gt;DayOfYear&amp;nbsp;&amp;nbsp; : 359&lt;BR&gt;Hour&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 7&lt;BR&gt;Kind&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Unspecified&lt;BR&gt;Millisecond : 0&lt;BR&gt;Minute&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0&lt;BR&gt;Month&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 12&lt;BR&gt;Second&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0&lt;BR&gt;Ticks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 633026268000000000&lt;BR&gt;TimeOfDay&amp;nbsp;&amp;nbsp; : 07:00:00&lt;BR&gt;Year&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 2006&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Many .NET types can do equally powerful things, saving users TONS of effort by parsing strings and making the intersesting elements available as properties and/or exposing powerful methods.&amp;nbsp; The problem is that some .NET types do this by taking a string constructor, some do it by having a static PARSE() method on the class, others do it by having a CONVERTER for Strings.&amp;nbsp; Admins don't want to deal with that so Monad takes care of this mechanical&amp;nbsp;housekeeping&amp;nbsp;for the user.&amp;nbsp; We will look for the appropriate constructor, parse method, or converter necessary to implement the user intentions.&amp;nbsp; For instance, &lt;FONT face="Courier New" size=2&gt;[DateTime]"12/25/2006"&lt;/FONT&gt; uses the Parse() method whereas &lt;FONT face="Courier New" size=2&gt;[System.Diagnostics.EventLog]"Application"&lt;/FONT&gt; uses a string constructor.&lt;/P&gt;
&lt;P&gt;I mentioned that the .NET type then exposes a set of great methods for the user.&amp;nbsp; I have relatives in the UK so if we want to ship presents to those kids, they need to get in the mail early.&amp;nbsp; So let's just say that things need to be shipped 35 days in advanced - when do they need to get in the mail?&amp;nbsp; I have no clue but luckily .NET is smarter than I am so I can do the following:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; ([datetime]"12/25/2006").AddDays(-35)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Saturday, November 20, 2006 12:00:00 AM&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;So that is great if you knew that the .NET object had a AddDays method and that you could provide it a negative number to do subtraction.&amp;nbsp; On the other hand, enhanced .NET access is event smarter than raw .NET access so you can just do the following:&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; [datetime]"12/25/2006" - "35.0:00"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Monday, November 20, 2006 12:00:00 AM&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Monad takes advantage of the fact that the .NET DateTime type support the Op_Subtraction() method. Monad determines that DateTimes can subtract [System.TimeSpan] types so it automatically converts the string "35.0.00" into this format and calls that method. The result of all this is that admins get to think and type this:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New" size=2&gt; &lt;FONT size=1&gt;[datetime]"12/25/2006" - "35.0:00"&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;Instead of this:&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" size=1&gt;[DateTime] $date&amp;nbsp;&amp;nbsp;&amp;nbsp; = [DateTime]::Parse("12/25/2006 7:00")&lt;BR&gt;&amp;nbsp;&amp;nbsp; [TimeSpan] $t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = [TimeSpan]::Parse("35.0:00")&lt;BR&gt;&amp;nbsp;&amp;nbsp; [DateTime] $newdate = [DateTime]::Op_Subtraction($date, $t)&lt;BR&gt;&amp;nbsp;&amp;nbsp; [Console]::WriteLine($newdate.ToString())&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;When it comes to outputing objects, Monad allows you to enhance the .NET objects by defining overrides for their ToString() method, grouping the objects properties into named propertysets, and to define which of the objects properties are the default display properties.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;U&gt;Command Access&lt;BR&gt;&lt;/U&gt;&lt;/STRONG&gt;Command access is the most admin-friendly way to interact with the system.&amp;nbsp; Commands exist because someone thought about the needs of the Administrator and coded a good user experience on top of the .NET objects.&amp;nbsp; Let me give you some examples of the what that means (this is not a complete list):&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Consistent naming of the commands and its parameters&lt;/LI&gt;
&lt;LI&gt;Support for wildcards when specifying objects&lt;/LI&gt;
&lt;LI&gt;Support for -Whatif -Confirm for actions that have side effects&lt;/LI&gt;
&lt;LI&gt;Produce great errors with all the info necessary to recover from the error&lt;/LI&gt;
&lt;LI&gt;Distinguish between terminating and non-terminating errors&lt;/LI&gt;
&lt;LI&gt;Emit information on output, verbose, debug, and error streams&lt;/LI&gt;
&lt;LI&gt;Issue progress records if an operation takes more than a second or two&lt;/LI&gt;
&lt;LI&gt;Design the a set of commands and their outputs so that they can easily pipeline together (object properties with names and types that match command parameters)&lt;/LI&gt;
&lt;LI&gt;Specify validation metadata on parameters so that the Monad engine&lt;/LI&gt;
&lt;LI&gt;Provide meta data to drive the formating of your output objects&lt;/LI&gt;
&lt;LI&gt;Provide great help with detailed descriptions and lots of examples&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This sounds like a lot and while there is a lot to get right when it comes to providing the right user experience, the amount of code to do this is very small because this is the design center for Monad's SDK.&amp;nbsp; Most cmdlets are extremely small making them one of the best bargains in the industry.&amp;nbsp; In fact, that is the way we define what a Monad Cmdlet is:&amp;nbsp; the very thin layer on top of .NET necessary to provide a great user experience.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Getting objects through the command access is pretty straight forward.&amp;nbsp; It is typically done with a Get-XXX command.&amp;nbsp; These commands often provide a rich set of functions for getting the right objects.&amp;nbsp; Many support rich wildcarding (e.g. Get-Process [a-t]*[g-v] ) and provide excellent error messages and error handling if and when something goes wrong.&amp;nbsp; The other way to get objects is to expose a datastore as a system drive and then Monad provides common set of commands to naviagate the datastore and get objects.&amp;nbsp; (e.g. CD xxx; get-item; get-itemproperty, get-childitem, get-content, etc).&lt;/P&gt;
&lt;P&gt;Manipulating objects through commands is done through a rich set of object-based utility commands like: Where, Group, Measure, Tee, Sort,&amp;nbsp;and Compare.&lt;/P&gt;
&lt;P&gt;Lastly, there are a wide range commands for outputing results including: Export-CSV, Export-CliXml, Out-File, Out-Printer, Out-Default, Out-String, Out-Host, Format-List, Format-Table, Format-Wide, Format-custom, Write-Object, Write-Progress, Write-Error, Write-Log, Write-Debug, Write-Warning, Write-Host.&lt;/P&gt;
&lt;P&gt;So to sum up, users write scripts/programs that get objects, process objects and generate results.&amp;nbsp; Monad provides 3 modes of doing each of these steps:&amp;nbsp; raw .NET access, enhanced .NET access and Command access.&amp;nbsp; Users can mix and match modes to their hearts content. This architecture:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Allows users to pick the programming style that matches their thinking style.&lt;/LI&gt;
&lt;LI&gt;Allows the Monad engine to eliminate the programming housekeeping hassles so you can focus on problem you want to solve not HOW you are going to solve it.&lt;/LI&gt;
&lt;LI&gt;Ensures full and complete functional coverage so that you aren't stuck if a function you want isn't available at the abstraction you want it. &lt;/LI&gt;
&lt;LI&gt;Allows admins, basic scripters, advanced scripters and programmers to form a large common community to share information and scripts.&lt;/LI&gt;
&lt;LI&gt;Allows individuals to migrate to whatever level of programming they are interested in or is required by the problem at hand.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Man - I just love this stuff!&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;BR&gt;Jeffrey Snover&lt;BR&gt;Monad Architect&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=582155" width="1" height="1"&gt;</description></item><item><title>Comparative Examples in MSH and KSH</title><link>http://blogs.msdn.com/monad/archive/2006/04/22/581065.aspx</link><pubDate>Sat, 22 Apr 2006 02:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:581065</guid><dc:creator>Monad Team</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/monad/comments/581065.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=581065</wfw:commentRss><description>&lt;DIV class=Section1&gt;
&lt;H1&gt;&amp;nbsp;&lt;/H1&gt;
&lt;P class=MsoNormal&gt;&lt;FONT size=+1&gt;M&lt;/FONT&gt;ost shells (such as Windows CMD.EXE and the UNIX shells SH, KSH, CSH, and BASH) operate by executing a command or utility in a new process, and presenting the results (or errors) to the user as text. Text-based processing is the way in which system interaction is done with these shells. Over the years, a large number of text processing utilities—such as sed, AWK, and PERL—have evolved to support this interaction. The heritage of this operational process is very rich. &lt;/P&gt;
&lt;P class=MsoNormal&gt;MSH is very different from these traditional shells. First, this shell does not use text as the basis for interaction with the system, but uses an object model based on the .NET platform. Second, the list of built-in commands is much larger; this is done to ensure that the interaction with the object model is accomplished with the highest regard to integrity with respect to interacting with the system. Third, the shell provides consistency with regard to interacting with built-in commands through the use of a single parser, rather than relying on each command to create its own parser for parameters. &lt;/P&gt;
&lt;P class=MsoNormal&gt;This document constrasts the Korn Shell (KSH) and MSH by providing a number of examples of each. &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 1&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;To stop all processes that begin with the letter "p" on a UNIX system, an administrator would have to type the following shell command line:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ps&lt;/SPAN&gt;&lt;/SPAN&gt; -e | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; " p" | &lt;SPAN class=SpellE&gt;awk&lt;/SPAN&gt; '{ print $1 }' | &lt;SPAN class=SpellE&gt;xargs&lt;/SPAN&gt; kill&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;The &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;ps&lt;/SPAN&gt;&lt;/SPAN&gt; command retrieves list of processes and directs (|) the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;grep&lt;/SPAN&gt;&lt;/SPAN&gt; command to determine which process begins with "p"; which in turn directs (|) the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;awk&lt;/SPAN&gt;&lt;/SPAN&gt; command to select the 1st column (which is in the process id) and then passes (|) those to the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;xargs&lt;/SPAN&gt;&lt;/SPAN&gt; command which then executes the &lt;SPAN class=System&gt;kill&lt;/SPAN&gt; command for each process.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The fragility of this command line may not be evident, but if the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;ps&lt;/SPAN&gt;&lt;/SPAN&gt; command behaves differently on different systems, where the "-e" flag may not be present, or if the processed command is not in column 1 of the output, this command-line procedure will fail. &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; get-process p* | stop-process&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;Thus, the command line may now be expressed as "get the processes whose name starts with "p" and stop them".&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The &lt;SPAN class=System&gt;get-process&lt;/SPAN&gt; Cmdlet takes an argument that matches the process name; the objects returned by &lt;SPAN class=System&gt;get-process&lt;/SPAN&gt; are passed directly to the &lt;SPAN class=System&gt;stop-process&lt;/SPAN&gt; Cmdlet that acts on those objects by stopping them.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The second, more convoluted example, which stops processes that use more than 10 MB of &lt;SPAN class=GramE&gt;memory&lt;/SPAN&gt; becomes quite simple.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 2&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Another, even more complex example, such as "find the processes that use more than 10 MB of memory and kill them" can lead to an equally failed outcome:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ps&lt;/SPAN&gt;&lt;/SPAN&gt; -el | &lt;SPAN class=SpellE&gt;awk&lt;/SPAN&gt; '{ if ( $6 &amp;gt; (1024*10)) { print $3 } }' | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; -v PID | &lt;SPAN class=SpellE&gt;xargs&lt;/SPAN&gt; kill&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;The success of this command line relies on the user knowing that the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;ps&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=System&gt; -el&lt;/SPAN&gt; command will return the size of the process in kilobytes (kb) in column 6 and that the PID of the process is in column 3.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;It is still required that the first row is removed.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Comparing Example 1 using a standard shell to Example 1a using MSH, we can see that the commands act against objects rather than against text.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; get-process | where &lt;SPAN class=GramE&gt;{ $&lt;/SPAN&gt;_.VS -&lt;SPAN class=SpellE&gt;gt&lt;/SPAN&gt; 10M } | stop-process&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;There is no issue about determining the column that contains the size of the process, or which column contains the &lt;SPAN class=SpellE&gt;ProcessID&lt;/SPAN&gt;.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The memory size may be referred to logically, by its name.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The &lt;SPAN class=System&gt;where&lt;/SPAN&gt; Cmdlet can inspect the incoming object directly and refer to its properties.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The comparison of the value for that property is direct and understandable.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 3&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;For example, if you wanted to calculate the number of bytes in the files in a directory, you would iterate over the files, getting the length and adding to a variable, and then print the variable:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=SnippetCxSpFirst style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ &lt;SPAN class=GramE&gt;tot=&lt;/SPAN&gt;0; for file in $( &lt;SPAN class=SpellE&gt;ls&lt;/SPAN&gt; )&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt; do&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;set -- $&lt;SPAN class=GramE&gt;( &lt;SPAN class=SpellE&gt;ls&lt;/SPAN&gt;&lt;/SPAN&gt; -log $file&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;echo $3&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(&lt;SPAN class=GramE&gt;( tot&lt;/SPAN&gt; = $tot + $3 ))&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpLast style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt; done; echo $tot&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;This example uses the &lt;SPAN class=System&gt;set&lt;/SPAN&gt; shell command that creates numbered variables for each white space separated element in the line rather than the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;awk&lt;/SPAN&gt;&lt;/SPAN&gt; command as in the examples above.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;If the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;awk&lt;/SPAN&gt;&lt;/SPAN&gt; command were used, it would be possible to reduce the steps to the following:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ls&lt;/SPAN&gt;&lt;/SPAN&gt; –l | &lt;SPAN class=SpellE&gt;awk&lt;/SPAN&gt; ‘{ tot += $5; print tot; }’ | tail -1&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;This reduces the complexity, but requires specific knowledge of a new language, the language that is associated with the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;awk&lt;/SPAN&gt;&lt;/SPAN&gt; command. &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The MSH loop is similar; each file in the directory is needed, but it is far simpler as the information about the file is already retrieved:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; get-&lt;SPAN class=SpellE&gt;childitem&lt;/SPAN&gt; | measure-object -Property length&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;The &lt;SPAN class=System&gt;measure-object&lt;/SPAN&gt; Cmdlet interacts with objects and if it is provided with a property from the object, it will sum the values of that property.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Because the property length represents the length of the file, the &lt;SPAN class=System&gt;measure-object&lt;/SPAN&gt; Cmdlet is able to act directly on the object by referring to the property name rather than “knowing” that the length of the file is in column 3 or column 5.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 4&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Many objects provided by the system are not static, but dynamic.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This means that after an object is acquired, it is not necessary to acquire the object at a later time.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The data in the object is updated as the conditions of the system change.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Also, changes to these objects are reflected immediately in the system.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;As an example, suppose one wanted to collect the amount of processor time that a process used over time.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In the traditional UNIX model, the &lt;SPAN class=SpellE&gt;&lt;SPAN class=System&gt;ps&lt;/SPAN&gt;&lt;/SPAN&gt; command would need to be run iteratively and the appropriate column in the output would need to be found and then the subtraction would need to be done.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;With a shell that is able to access the process object of the system, it is possible to acquire the process object once, and since this object is continually updated by the system; all that is necessary is to refer to the property.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The following examples illustrate the differences, where the memory size of an application is checked in ten second intervals and the differences are output:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=SnippetCxSpFirst style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ &lt;SPAN class=GramE&gt;while&lt;/SPAN&gt; [ true ]&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=GramE&gt;do&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;msize1=$( &lt;SPAN class=SpellE&gt;ps&lt;/SPAN&gt; -el | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; application | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; -v &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; | &lt;SPAN class=SpellE&gt;awk&lt;/SPAN&gt; '{&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;print $6 }' )&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=GramE&gt;sleep&lt;/SPAN&gt; 10&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;msize2=$&lt;SPAN class=GramE&gt;( &lt;SPAN class=SpellE&gt;ps&lt;/SPAN&gt;&lt;/SPAN&gt; -el | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; application | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; -v &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; | &lt;SPAN class=SpellE&gt;awk&lt;/SPAN&gt; '{&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;print $6 }' )&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;expr&lt;/SPAN&gt;&lt;/SPAN&gt; $msize2 - $msize1&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;msize1=$msize2&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpLast style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=GramE&gt;done&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=SnippetCxSpFirst style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; $app = get-process application&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; while &lt;SPAN class=GramE&gt;( 1&lt;/SPAN&gt; ) {&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&amp;gt; $msize1 = $&lt;SPAN class=SpellE&gt;app.VS&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&amp;gt; &lt;SPAN class=GramE&gt;start-sleep&lt;/SPAN&gt; 10&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&amp;gt; $&lt;SPAN class=SpellE&gt;app.VS&lt;/SPAN&gt; - $msize1&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpLast style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&amp;gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 5&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;It is even more difficult to determine whether a specific process is no longer running.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In this case, the UNIX user must collect the list of processes and compare them to another list.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=StyleSnippet8ptCxSpFirst style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;processToWatch&lt;/SPAN&gt;&lt;/SPAN&gt;=$( &lt;SPAN class=SpellE&gt;ps&lt;/SPAN&gt; -e | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; application | &lt;SPAN class=SpellE&gt;awk&lt;/SPAN&gt; '{ print $1 }'&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ &lt;SPAN class=GramE&gt;while&lt;/SPAN&gt; [ true ]&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt; do&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;sleep 10&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;processToCheck&lt;/SPAN&gt;&lt;/SPAN&gt;=$(&lt;SPAN class=SpellE&gt;ps&lt;/SPAN&gt; -e | &lt;SPAN class=SpellE&gt;grep&lt;/SPAN&gt; application | &lt;SPAN class=SpellE&gt;awk&lt;/SPAN&gt; '{ print $1 }' )&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=GramE&gt;if&lt;/SPAN&gt; [ -z "$&lt;SPAN class=SpellE&gt;processToCheck&lt;/SPAN&gt;" -or "$&lt;SPAN class=SpellE&gt;processToWatch&lt;/SPAN&gt;" != "$&lt;SPAN class=SpellE&gt;processToCheck&lt;/SPAN&gt;" ]&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=GramE&gt;then&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;echo "Process application is not running"&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;return&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;fi&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=StyleSnippet8ptCxSpLast style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&amp;gt; done&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=SnippetCxSpFirst style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; $&lt;SPAN class=SpellE&gt;processToWatch&lt;/SPAN&gt; = get-process application&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpLast style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; $&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;processToWatch.WaitForExit&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;As is seen in this example, the MSH user need only collect the object and then subsequently refer to that object.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 6&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;For example, suppose the user wanted to determine which processes were compiled as &lt;SPAN class=SpellE&gt;PreRelease&lt;/SPAN&gt; code, such as when applications have been compiled in such a way to mark them as "&lt;SPAN class=SpellE&gt;PreRelease&lt;/SPAN&gt;".&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ ???&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;This information is not kept in the standard UNIX executable.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;To determine this information, one would need to have a set of specialized utilities to add this information to the binary and then another set of utilities to collect this information.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;These utilities do not exist; it is not possible to accomplish this task.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=SnippetCxSpFirst style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; get-process | where {$_.&lt;SPAN class=SpellE&gt;mainmodule.FileVersioninfo.isPreRelease&lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=GramE&gt;Handles&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;NPM&lt;/SPAN&gt;(K)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;PM(K)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;WS(K) VS(M)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;CPU(s)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Id &lt;SPAN class=SpellE&gt;ProcessName&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;-------&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;------&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;-----&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;----- -----&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;------&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;-- -----------&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;643&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;88&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;1024&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;1544&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;15&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;14.06&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;1700 &lt;SPAN class=SpellE&gt;AdtAgent&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpLast style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;453&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;15&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;25280&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;7268&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;199&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;91.70&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;3952 &lt;SPAN class=SpellE&gt;devenv&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;In this example, a cascade of properties is done.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The appropriate property from the process object (&lt;SPAN class=SpellE&gt;MainModule&lt;/SPAN&gt;) is inspected, the property "&lt;SPAN class=SpellE&gt;FileVersionInfo&lt;/SPAN&gt;" is referenced (a property of &lt;SPAN class=SpellE&gt;MainModule&lt;/SPAN&gt;) and the value of the property "&lt;SPAN class=SpellE&gt;IsPreRelease&lt;/SPAN&gt;" is used to filter the results.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;If &lt;SPAN class=SpellE&gt;IsPreRelease&lt;/SPAN&gt; is true, the objects that are output by the &lt;SPAN class=System&gt;get-process&lt;/SPAN&gt; Cmdlet are output.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 7&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Each object may or may not provide methods; MSH provides commands to aid the discovery of methods that are available for a specific object via the &lt;SPAN class=System&gt;get-member&lt;/SPAN&gt; Cmdlet.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;For example, the string object has a large number of methods:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=SnippetCxSpFirst style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; get-member -input "String" -&lt;SPAN class=SpellE&gt;membertype&lt;/SPAN&gt; method | format-table "$_"&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;"$_"&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;---------&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.Object&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Clone()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=GramE&gt;Compare(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, Boolean, &lt;SPAN class=SpellE&gt;System.Globalization.Cul&lt;/SPAN&gt;..&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;CompareOrdinal&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, Int32, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, Int32, Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;CompareTo&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;Concat&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=GramE&gt;Contains(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Copy(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Void &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;CopyTo&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Int32, Char[], Int32, Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;EndsWith&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, Boolean, &lt;SPAN class=SpellE&gt;System.Globalization.CultureInfo&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=GramE&gt;Equals(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.StringComparison&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Format(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.Object&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.Object&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Char &lt;SPAN class=SpellE&gt;get_&lt;SPAN class=GramE&gt;Chars&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;get_&lt;SPAN class=GramE&gt;Length&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.CharEnumerator&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;GetEnumerator&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;GetHashCode&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.Type&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;GetType&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.TypeCode&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;GetTypeCode&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;IndexOf&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;IndexOfAny&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Char[], Int32, Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Insert(&lt;/SPAN&gt;Int32, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Intern(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;IsInterned&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;IsNormalized&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;IsNullOrEmpty&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Join(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;[])&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;LastIndexOf&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Char, Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Int32 &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;LastIndexOfAny&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Char[], Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Normalize(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.Text.NormalizationForm&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=SpellE&gt;op_&lt;SPAN class=GramE&gt;Equality&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=SpellE&gt;op_&lt;SPAN class=GramE&gt;Inequality&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;PadLeft&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Int32, Char)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;PadRight&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Int32, Char)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Remove(&lt;/SPAN&gt;Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Replace(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;, &lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;System.String&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;[&lt;/SPAN&gt;] &lt;?xml:namespace prefix = st1 /&gt;&lt;st1:place w:st="on"&gt;&lt;st1:City w:st="on"&gt;Split&lt;/st1:City&gt;&lt;/st1:place&gt;(&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;[], &lt;SPAN class=SpellE&gt;System.StringSplitOptions&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;Boolean &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;StartsWith&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Substring(&lt;/SPAN&gt;Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=GramE&gt;Char[&lt;/SPAN&gt;] &lt;SPAN class=SpellE&gt;ToCharArray&lt;/SPAN&gt;(Int32, Int32)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ToLower&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ToLowerInvariant&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ToString&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.IFormatProvider&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ToUpper&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;&lt;SPAN class=SpellE&gt;System.Globalization.CultureInfo&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;ToUpperInvariant&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=GramE&gt;Trim()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpMiddle style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;TrimEnd&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Char[])&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=SnippetCxSpLast style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;&lt;SPAN class=SpellE&gt;System.String&lt;/SPAN&gt; &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;TrimStart&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;Char[])&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;As can be seen, 46 different methods are available to the string object all of which are available to the MSH user.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Unfortunately, the semantics of these methods is not visible from the shell, but a number of .NET object help is available online. &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 8&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The availability of these methods creates an explosion of possibilities.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;For example, if I wanted to change the case of a string from lower to upper I would do the following: (first &lt;SPAN class=SpellE&gt;ksh&lt;/SPAN&gt; and then MSH).&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ echo "this is a string" | &lt;SPAN class=SpellE&gt;tr&lt;/SPAN&gt; [&lt;SPAN class=GramE&gt;:lower&lt;/SPAN&gt;:] [:upper:]&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN class=GramE&gt;or&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ echo "this is a string" | &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;tr&lt;/SPAN&gt;&lt;/SPAN&gt; '[a-z]' &lt;SPAN class=SpellE&gt;'&lt;/SPAN&gt;[A-Z]'&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; "this is a &lt;SPAN class=SpellE&gt;string".&lt;SPAN class=GramE&gt;ToUpper&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;()&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;The UNIX example relies on the &lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;&lt;SPAN class=System&gt;tr&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt; cmdlet.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;Example 9&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;For example, suppose the string "ABC" was to be inserted after the first character in the word "string" to have the result "&lt;SPAN class=SpellE&gt;sABCtring&lt;/SPAN&gt;".&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Here are the following, first with &lt;SPAN class=SpellE&gt;ksh&lt;/SPAN&gt;, then with MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;$ echo "string" | &lt;SPAN class=SpellE&gt;sed&lt;/SPAN&gt; "s|&lt;SPAN class=GramE&gt;\(&lt;/SPAN&gt;.\)\(.*)|\1ABC\2|"&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;MSH:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: silver 2.25pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: silver 2.25pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 1pt; MARGIN-LEFT: 0.2in; BORDER-LEFT: silver 2.25pt solid; MARGIN-RIGHT: 0in; PADDING-TOP: 1pt; BORDER-BOTTOM: silver 2.25pt solid; mso-element: para-border-div"&gt;
&lt;P class=Snippet style="MARGIN-LEFT: 0in; mso-add-space: auto"&gt;MSH&amp;gt; "&lt;SPAN class=SpellE&gt;string".&lt;SPAN class=GramE&gt;Insert&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;1,"ABC")&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;Both examples require specific knowledge; however, using the "insert" method is more intuitive than using the capture buffers available in &lt;SPAN class=SpellE&gt;sed&lt;/SPAN&gt;.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Moreover, the domain specific knowledge of the "&lt;SPAN class=SpellE&gt;sed&lt;/SPAN&gt;" language required may be somewhat more advanced than is required to use the Insert method.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;BR&gt;&lt;BR&gt;
&lt;HR&gt;
&lt;BR&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;Jim Truher and Jeffrey Snover&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=581065" width="1" height="1"&gt;</description></item><item><title>Why did you do that?  $VAR/ {} / Weak Intellisense</title><link>http://blogs.msdn.com/monad/archive/2006/04/17/577327.aspx</link><pubDate>Mon, 17 Apr 2006 04:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:577327</guid><dc:creator>Monad Team</dc:creator><slash:comments>12</slash:comments><comments>http://blogs.msdn.com/monad/comments/577327.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=577327</wfw:commentRss><description>&lt;DIV dir=ltr&gt;&lt;FONT face=Tahoma size=1&gt;
&lt;DIV&gt;&lt;FONT face=Arial size=3&gt;I strongly encourage people to let us know where we could be doing better&amp;nbsp;and to let us know if we&amp;nbsp;are getting into the weeds.&amp;nbsp; I believe that being open to such bad news is core to the the virtuous cycle of self improvement so such feedback&amp;nbsp;provides opportunities to reflect and make changes when appropriate.&amp;nbsp; Other times&amp;nbsp;we'll&amp;nbsp;just agree to disagree.&amp;nbsp; Occassionally I'll take some of that feedback and use it to explain what or why we do things.&amp;nbsp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;FONT face=Arial&gt;
&lt;DIV&gt;&lt;BR&gt;&lt;FONT size=3&gt;Recently Raul from Switzerland took some time to document some of the things he thought we should be doing better.&amp;nbsp; I thought I would discuss some of these here so that everyone could understand how we think about things.&amp;nbsp; I asked Raul what 3 things he would change.&amp;nbsp; He replied:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;DIV&gt;&lt;FONT face=Tahoma size=1&gt;- OK, first get rid of the $-sign to denominate variables. We have come much further than that in the meantime. Low level programming languages like Visual Dialog Script (&lt;/FONT&gt;&lt;A title=blocked::http://www.dialogscript.com/ href="http://www.dialogscript.com/"&gt;&lt;FONT face=Tahoma color=#800080 size=1&gt;www.dialogscript.com&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Tahoma size=1&gt;), Kix,&amp;nbsp;Pearl, or PHP need these parsing aids. We should not go back to that.&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Tahoma size=1&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Tahoma size=1&gt;- Next, get rid of the horrific {$._} construct, not only because the curly braces are available only together with ALT-GR on most non-US keyboards. Furthermore, it is impossible to read (for non-programmers). Programmers are accustomed to such constructs and worse ones. But if you want to gain heart and mind of the administrators, that is not the way.&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Tahoma size=1&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Tahoma size=1&gt;- Provide some kind of assistance when typing the dot after an object, simlar to Intellisense. If you want administrators NOT to read tons and tons of books, well, the only way is to provide online assistance, like Intellisense. Your presentation started gearing towards administrators but very shortly thereafter, there were hardcore programmers speaking to other hardcore programmers, in the most pure tech-talk. I assume, that you would have lost your non-hardcore programmers audience after 20-30 minutes. &lt;/FONT&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;&lt;FONT face=Arial&gt;
&lt;DIV&gt;The &lt;STRONG&gt;$ in front of variables&lt;/STRONG&gt; comes from our design center of being an interactive command oriented shell.&amp;nbsp; Interactive shells are NOT the same thing as Scripting languages with command interpretors.&amp;nbsp; Interactive shells are case studies in engineering tradeoffs (another way of saying that is that they tend to be a little quirky).&amp;nbsp; There is a tension between the needs of a great interactive experience and a great scripting/programming experience.&amp;nbsp; Time and time again during the course of the project, people would try to make us "choose" between one or the other.&amp;nbsp; We refused.&amp;nbsp; &lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;We believe that if you work hard enough at it, you can&amp;nbsp;solve the puzzle and&amp;nbsp;provide a great solution for both.&amp;nbsp; We were absolutely subborn on this point.&amp;nbsp; Time and time again, we were able to succeed with this&amp;nbsp;approach if we travailed long enough.&amp;nbsp; There has only been one issue where we could not optimize for both goals and had make a choice (using "&amp;gt;" to mean file redirection instead of "-gt").&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;Anyway, that is the reason why we use "$"s in front of variables.&amp;nbsp; Bruce Payette is writting a book about Monad and goes into significantly more detail about the specifics of our decisions and why we made them (your going to love it).&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;STRONG&gt;"{}" vs BEGIN/END&amp;nbsp; IF/FI&amp;nbsp; WHILE/WEND&amp;nbsp; DO/OD etc etc&lt;/STRONG&gt;.&amp;nbsp; This was resolved pretty quickly for us based upon 2 factors.&amp;nbsp; &lt;/DIV&gt;
&lt;OL&gt;
&lt;LI&gt;We looked at the all the mechanisms shells/scripts use and thought that most of the shell and script ones were .... well .... ummm .... inconsistent and not the&amp;nbsp;strongest features of these environments.&lt;/LI&gt;
&lt;LI&gt;We wanted to provide a smooth glide path between GUI, CLI, and C#.&amp;nbsp; &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;As such, use of {} was an easy choice for us.&amp;nbsp; Now let me say a&amp;nbsp;couple more words about #2.&amp;nbsp; Monad is NOT C#Script.&amp;nbsp; It is a distinct environment focused on distinct user scenarios that are quite different than C#.&amp;nbsp; The language and environment reflect that.&amp;nbsp;&amp;nbsp;When we designed the language we looked at a&amp;nbsp; number of different environments (SH, PERL, RUBY, VMS/DCL, AS400/CL, and C#) and took inspiration from elements of many of these.&amp;nbsp; We also wanted Monad to have the widest dynamic range possible.&amp;nbsp; It should be easy to start using, easy to start scripting, easy to do sophisticated scripting and you should be able to use Monad to do most everything you want to do.&amp;nbsp; That said, we know that at some point Monad will not meet your needs and you'll&amp;nbsp;need to do systems programming (typically for perf reasons).&amp;nbsp; When this occurs, we want to minimize&amp;nbsp;your switching costs.&amp;nbsp; This is why we use choose to use C# for many basic elements that do not conflict with our interactive scenarios.&amp;nbsp; {} is just one of many.&amp;nbsp;We think that this has worked out pretty well.&amp;nbsp; Monad is a fantastic environment to explore .NET and while most of Monad is written using C#, a number of our devs do prototyping work in Monad itself and then translate it into C#.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Intellisense&lt;/STRONG&gt;.&amp;nbsp; I totally concur.&amp;nbsp; The current system is relies too much on .NET objects and our tab completion is too weak.&amp;nbsp; It is going to take a while before you can do everything using cmdlets (instead of .NET objects) however in the next drop (Next week), you'll see that tab completion&amp;nbsp;gets much better.&amp;nbsp; We'll provide tab completion for filenames, command names, command parameters, object properties and methods.&amp;nbsp; Tab completion is actually a callout to a user-definable function so that the community can get as sophisticated as they'd like to.&amp;nbsp; This feature has lagged because we have strongly focused on the command line experience and invested there instead of spending time on things like IDEs.&amp;nbsp; We are relying on the community and third parties to fullfill this need in the V1 timeframe.&amp;nbsp; That said, user feedback was strong enough on this point that we knew that we had do improve things for V1.&amp;nbsp; We hope you like what you get next week.&lt;/P&gt;
&lt;P&gt;As always, please let me know if this is not the case or if you think that there are things we should be doing better. &lt;/P&gt;
&lt;P&gt;Raul - thanks for taking the time to organize and send me your feedback.&amp;nbsp; I hope this blog provides some more context around why we made the decisions that we did.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;P&gt;Jeffrey Snover&lt;BR&gt;Monad Architect&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=577327" width="1" height="1"&gt;</description></item><item><title>Sunday morning drive with my hair on fire: Types/Community/Synthetic types/Democracy/Cool XML tricks</title><link>http://blogs.msdn.com/monad/archive/2006/04/16/577232.aspx</link><pubDate>Sun, 16 Apr 2006 20:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:577232</guid><dc:creator>Monad Team</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/monad/comments/577232.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=577232</wfw:commentRss><description>&lt;P&gt;Exploring types is a pain!&lt;/P&gt;
&lt;P&gt;Monad provides Get-Member which makes it pretty nice to explore an OBJECT but if you want to explore that object's type, you have to use the capabilities of the System.RuntimeType class.&lt;/P&gt;
&lt;P&gt;Let me make that distinction a little clearer.&amp;nbsp; Imagine that I've got some xml:&lt;BR&gt;$x=[XML]"&amp;lt;a&amp;gt;&amp;lt;b&amp;gt;TEST&amp;lt;/b&amp;gt;&amp;lt;a&amp;gt;"&lt;/P&gt;
&lt;P&gt;I can explore this object using get-member (using the GM alias)&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;MSH&amp;gt; $x |gm&lt;BR&gt;&amp;nbsp;&amp;nbsp; TypeName: System.Xml.XmlDocument&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemberType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Definition&lt;BR&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&lt;BR&gt;ToString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodeMethod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static System.St...&lt;BR&gt;add_NodeChanged&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Void add_...&lt;BR&gt;add_NodeChanging&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Void add_...&lt;BR&gt;...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;But now imagine that I want to exlore System.XML.XMLDocument ([XML]) itself?&amp;nbsp; Here is what you get:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;MSH&amp;gt; [xml]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;IsPublic IsSerial Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BaseType&lt;BR&gt;-------- -------- ----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------&lt;BR&gt;True&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; False&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlDocument&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System....&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;MSH&amp;gt; [xml] |fl *&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;Module&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.dll&lt;BR&gt;Assembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml, Version=2.0.0.0, Culture=neu&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tral, PublicKeyToken=b77a5c561934e089&lt;BR&gt;TypeHandle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.RuntimeTypeHandle&lt;BR&gt;DeclaringMethod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;BR&gt;BaseType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlNode&lt;BR&gt;UnderlyingSystemType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlDocument&lt;BR&gt;FullName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlDocument&lt;BR&gt;AssemblyQualifiedName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlDocument, System.Xml, Vers&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ion=2.0.0.0, Culture=neutral, PublicKeyT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oken=b77a5c561934e089&lt;BR&gt;Namespace&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml&lt;BR&gt;GUID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 3d63bf4b-edbe-36cb-b7b2-df87f38db07d&lt;BR&gt;GenericParameterAttributes :&lt;BR&gt;IsGenericTypeDefinition&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsGenericParameter&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;GenericParameterPosition&amp;nbsp;&amp;nbsp; :&lt;BR&gt;IsGenericType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;ContainsGenericParameters&amp;nbsp; : False&lt;BR&gt;StructLayoutAttribute&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Runtime.InteropServices.StructLay&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outAttribute&lt;BR&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : XmlDocument&lt;BR&gt;MemberType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : TypeInfo&lt;BR&gt;DeclaringType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;BR&gt;ReflectedType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;BR&gt;MetadataToken&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 33554636&lt;BR&gt;TypeInitializer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Void .cctor()&lt;BR&gt;IsNested&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;Attributes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : AutoLayout, AnsiClass, Class, Public, Be&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreFieldInit&lt;BR&gt;IsVisible&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsNotPublic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsPublic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsNestedPublic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsNestedPrivate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsNestedFamily&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsNestedAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsNestedFamANDAssem&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsNestedFamORAssem&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsAutoLayout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsLayoutSequential&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsExplicitLayout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsClass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsInterface&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsValueType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsAbstract&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsSealed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsEnum&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsSpecialName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsImport&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsSerializable&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsAnsiClass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsUnicodeClass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsAutoClass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsArray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsByRef&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsPointer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsPrimitive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsCOMObject&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;HasElementType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsContextful&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsMarshalByRef&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;So that has LOTS of great information but the things that I usually want are the types Constructors, Properties, Methods, Interfaces etc.&amp;nbsp; That should be easy right?&amp;nbsp; The type has the method GetConstructors().&amp;nbsp; Lets see what that gives you.&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;MSH&amp;gt; [xml].GetConstructors()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : .ctor&lt;BR&gt;MemberType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Constructor&lt;BR&gt;DeclaringType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlDocument&lt;BR&gt;ReflectedType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlDocument&lt;BR&gt;MetadataToken&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 100666404&lt;BR&gt;Module&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.dll&lt;BR&gt;MethodHandle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.RuntimeMethodHandle&lt;BR&gt;Attributes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : PrivateScope, Public, HideBySig, SpecialN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ame, RTSpecialName&lt;BR&gt;CallingConvention&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Standard, HasThis&lt;BR&gt;IsGenericMethodDefinition : False&lt;BR&gt;ContainsGenericParameters : False&lt;BR&gt;IsGenericMethod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsPublic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsPrivate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFamily&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFamilyAndAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFamilyOrAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsStatic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFinal&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsVirtual&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsHideBySig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsAbstract&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsSpecialName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsConstructor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : .ctor&lt;BR&gt;MemberType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Constructor&lt;BR&gt;DeclaringType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlDocument&lt;BR&gt;ReflectedType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.XmlDocument&lt;BR&gt;MetadataToken&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 100666405&lt;BR&gt;Module&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.dll&lt;BR&gt;MethodHandle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.RuntimeMethodHandle&lt;BR&gt;Attributes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : PrivateScope, Public, HideBySig, SpecialN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ame, RTSpecialName&lt;BR&gt;CallingConvention&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Standard, HasThis&lt;BR&gt;IsGenericMethodDefinition : False&lt;BR&gt;ContainsGenericParameters : False&lt;BR&gt;IsGenericMethod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsPublic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsPrivate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFamily&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFamilyAndAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFamilyOrAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsStatic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsFinal&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsVirtual&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsHideBySig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsAbstract&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;BR&gt;IsSpecialName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;IsConstructor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;OK - well that is cool and there&amp;nbsp;may be&amp;nbsp;times when I'd like those details (that hasn't happened up to this point in my life but I'm still reasonably young so I'm not ruling it out).&amp;nbsp; What I want to know is what is the signature of the constructor?&amp;nbsp; Well if you are smart enough to have an office near Bruce Payette, he may hear you ranting and come in to calm you down and inform you that the signatures area available when you do a ToString() so the way to get that is:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;MSH&amp;gt; [xml].GetConstructors() |foreach {"$_"}&lt;BR&gt;Void .ctor()&lt;BR&gt;Void .ctor(System.Xml.XmlNameTable)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Fine.&amp;nbsp; Now let's shift the discussion and talk about the power of community and the democratization of types.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Look, its easy to sit back and throw rocks saying - "that is a complex experience, those idiots should have forseen that and made it simple for us".&amp;nbsp; That&amp;nbsp;rock is&amp;nbsp;completely fair.&amp;nbsp; Now, if you go the next step and actually file a bug report, you might get this&amp;nbsp;fixed in a couple of years.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We designed MONAD with this in mind.&amp;nbsp; My customers don't have a couple of years to wait for the system to be fine tuned for their specific needs - my customers tend to run around with their hair on fire.&amp;nbsp; They need solutions ASAP.&amp;nbsp; One of the quickest ways to get a solution is to ask another smart person.&amp;nbsp; In my case, I was lucky enough to have Bruce just down the hall but with the internet, Bruce is virtually just down the hall from everyone.&amp;nbsp; (As a side note - I've just started to review a WONDERFUL book that Bruce is writing on Monad so in the future, you'll all be $30 away from having Bruce be in your very own home.)&lt;/P&gt;
&lt;P&gt;"Yea - the internet is good and communities help get answers fast" - so what?.&amp;nbsp; Well that's a pretty big deal but now let's turn our attention to the issue of what form community answers take and the differences in power these different forms take.&amp;nbsp; For instance, if someone gives you some expository text describing the solution, that is useful but not nearly as useful as when someone gives you a&amp;nbsp; piece of script that provides a solution.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Now imagine that this goes on year after year, developer by developer - Where is all that code?&amp;nbsp; How do people discover it?&amp;nbsp; How do you maintain it?&amp;nbsp; If you've pasted the code into your script, then there is a good chance that you've pasted it lots of time in lots of scripts and you've got a maintence mess on your hands.&amp;nbsp; Also - how does someone (say a new admin) find this?&amp;nbsp; If you factored it out into it's own script then you still have a discoverability problem even though you've addressed the maintenance problem.&lt;/P&gt;
&lt;P&gt;Let's step back and ask the question - why are we doing any of this anyway?&amp;nbsp; The answer is that the developers that created System.RunTimeType did not implement that class in a way that meets&amp;nbsp;our needs and they can't react quickly enough for&amp;nbsp;us to wait.&amp;nbsp; But in the end, the best of all solutions is for this function to be implemented as part of the type.&amp;nbsp; That way when I ask the type what it can do, it will tell me directly.&amp;nbsp; I don't have to go looking around in lots of scripts looking for whether there are additional functions layered on top.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Monad addresses this problem with a synthetic type system which allows the democratization of types.&amp;nbsp; Sure the developers of System.RunTimeType have an important role to play but they are just one voice in this this choir.&amp;nbsp; Lots of people should be able to extend the type with their own functions. Below is a contents of a file&amp;nbsp;MyTypes.mshxml (attached as well).&amp;nbsp; This file defines a number of new properties (Constructors, Methods, Properties, Interfaces, Events) for this type.&amp;nbsp; Type types are implemented using Monad so they are called ScriptProperites and in each case, the call an underlying api (using the $THIS variable which is set to the object being extended), sorting the elements by name&amp;nbsp;and piping the results into a foreach loop which casts the data to a string for easy reading.&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;lt;Types&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Type&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;System.RuntimeType&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Members&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Constructors&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GetScriptBlock&amp;gt;$this.GetConstructors() | foreach {"$_"}&amp;lt;/GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Methods&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GetScriptBlock&amp;gt;$this.GetMethods() |sort name | foreach {"$_"}&amp;lt;/GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Properties&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GetScriptBlock&amp;gt;$this.GetProperties() |sort name | foreach {"$_"}&amp;lt;/GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Interfaces&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GetScriptBlock&amp;gt;$this.GetInterfaces() |sort name | foreach {"$_"}&amp;lt;/GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Events&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GetScriptBlock&amp;gt;$this.GetEvents() |sort name | foreach {"$_"}&amp;lt;/GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Members&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Type&amp;gt;&lt;BR&gt;&amp;lt;/Types&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The command &lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;Update-TypeData MyTypes.mshxml&lt;/STRONG&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp; imports this information and updates the typedata for System.RuntimeType (I have a number of such statements in my profile file).&amp;nbsp; Now when I inspect types, this information is also available:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;MSH&amp;gt; [xml] |fl *&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;Constructors&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : {Void .ctor(), Void .ctor(System.Xml.Xml&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NameTable)}&lt;BR&gt;Methods&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : {Void add_NodeChanged(System.Xml.XmlNode&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ChangedEventHandler), Void add_NodeChang&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ing(System.Xml.XmlNodeChangedEventHandle&lt;BR&gt;&amp;nbsp;...&lt;BR&gt;Properties&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : {System.Xml.XmlAttributeCollection Attri&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; butes, System.String BaseURI, System.Xml&lt;BR&gt;...&lt;BR&gt;Interfaces&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : {System.ICloneable, System.Collections.I&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Enumerable, System.Xml.XPath.IXPathNavig&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; able}&lt;BR&gt;Events&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : {System.Xml.XmlNodeChangedEventHandler N&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; odeChanged, System.Xml.XmlNodeChangedEve&lt;BR&gt;...&lt;BR&gt;Module&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml.dll&lt;BR&gt;Assembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : System.Xml, Version=2.0.0.0, Culture=neu&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tral, PublicKeyToken=b77a5c561934e089&lt;BR&gt;...&lt;BR&gt;MSH&amp;gt; [xml].constructors&lt;BR&gt;Void .ctor()&lt;BR&gt;Void .ctor(System.Xml.XmlNameTable)&lt;BR&gt;&lt;BR&gt;MSH&amp;gt; [xml].interfaces&lt;BR&gt;System.ICloneable&lt;BR&gt;System.Collections.IEnumerable&lt;BR&gt;System.Xml.XPath.IXPathNavigable&lt;BR&gt;&lt;BR&gt;MSH&amp;gt; [xml].events&lt;BR&gt;System.Xml.XmlNodeChangedEventHandler NodeChanged&lt;BR&gt;System.Xml.XmlNodeChangedEventHandler NodeChanging&lt;BR&gt;System.Xml.XmlNodeChangedEventHandler NodeInserted&lt;BR&gt;System.Xml.XmlNodeChangedEventHandler NodeInserting&lt;BR&gt;System.Xml.XmlNodeChangedEventHandler NodeRemoved&lt;BR&gt;System.Xml.XmlNodeChangedEventHandler NodeRemoving&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;See how easy and powerful that is?&amp;nbsp; Again, we want to build a system which is self-discoverable.&amp;nbsp; That is why are are hard-core about naming (consistency on naming makes it easy for you to guess what to do and be right).&amp;nbsp; It is also why we provide interactive exploration tools like Get-Member and the interactive shell.&amp;nbsp; By using a synthetic type system, we allow new extensions to be added in a way that makes it easy for you to discover and utilize them.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Cool but wait a minute.&amp;nbsp; Did you notice that the XML datatype supports the NodeChanged Event.&amp;nbsp; What's up with that?&amp;nbsp; Let's check it out.&amp;nbsp; Rember that I defined $x to be an xml fragment up above, let's use to explore using the Start-NewScope function I provided yesterday:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;MSH&amp;gt; $x.Add_NodeChanged({Start-NewScope "NODE CHANGED&amp;gt; "})&lt;BR&gt;MSH&amp;gt; $x.a.b&amp;nbsp; = "New Value"&lt;BR&gt;Starting New Scope&lt;BR&gt;NODE CHANGED&amp;gt; $this | fl *&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;a : a&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;NODE CHANGED&amp;gt; $_ | fl *&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;Action&amp;nbsp;&amp;nbsp;&amp;nbsp; : Change&lt;BR&gt;Node&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : #text&lt;BR&gt;OldParent : b&lt;BR&gt;NewParent : b&lt;BR&gt;OldValue&amp;nbsp; : TEST&lt;BR&gt;NewValue&amp;nbsp; : New Value&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;NODE CHANGED&amp;gt; exit&lt;BR&gt;MSH&amp;gt; $x=[xml]"&amp;lt;a&amp;gt;&amp;lt;b&amp;gt;TEST&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;"&lt;BR&gt;&lt;BR&gt;MSH&amp;gt; $x.Add_NodeChanged({Write-Host $("XMLChange old {0} new {1}" -f $&lt;BR&gt;_.OldValue, $_.NewValue)})&lt;BR&gt;&lt;BR&gt;MSH&amp;gt; $x.a.b="NEW-VALUE"&lt;BR&gt;XMLChange old TEST new NEW-VALUE&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Is that cool or what?&amp;nbsp; I would have not known about that unless I was exploring the type.&amp;nbsp; 3 cheers for the democratization of types!&amp;nbsp; Now just to be clear, democracies&amp;nbsp;can be&amp;nbsp;messy things (that is why I like the analogy).&amp;nbsp; With lots of people updating the types, you can get name collisions, differing quality levels, etc.&amp;nbsp; There is no doubt that there are downsides to this model and that if you can get the original development teams to modify that type to meet your needs - it is a better model.&amp;nbsp; But for those of us that don't have either&amp;nbsp;the bandwidth to engage the original development teams, the ability to convince the teams that our scenarios are going to be needed by 80+% of the people, or the luxury of waiting a few years for the process to work itself out&amp;nbsp; - there is now a mechanism for us with our hair on fire to stick our heads in a bucket of water.&amp;nbsp; Sure, doing this might leave us the smell of burnt hair but I'd rather have&amp;nbsp;that than to have my hair still on fire.&amp;nbsp; :-)&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;P&gt;Jeffrey Snover&lt;BR&gt;Monad Architect&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=577232" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/monad/attachment/577232.ashx" length="1113" type="Text" /></item><item><title>How does Match-String with with Pipelines of objects? </title><link>http://blogs.msdn.com/monad/archive/2006/04/15/577013.aspx</link><pubDate>Sun, 16 Apr 2006 01:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:577013</guid><dc:creator>Monad Team</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/monad/comments/577013.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=577013</wfw:commentRss><description>&lt;P&gt;In&amp;nbsp;our newsgroup (Microsoft.Public.Windows.Server.Scripting) , Vasu asked about how match-string works in pipelines:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;BR&gt;Here is what I observe:&lt;BR&gt;1. MSH C:\&amp;gt; get-alias&lt;BR&gt;&amp;nbsp;..truncated..&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ri&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove-item&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rni&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rename-item&lt;BR&gt;..truncated..&lt;BR&gt;&lt;BR&gt;2. MSH C:\&amp;gt; get-alias | match-string ri&lt;BR&gt;ri&lt;BR&gt;MSH C:\&amp;gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The question is why did the string "ri" get emitted instead of the alias record.&lt;/P&gt;
&lt;P dir=ltr&gt;So what is going on here?&lt;/P&gt;
&lt;P dir=ltr&gt;Match-String works on Streams of STRINGS.&amp;nbsp; When you pass it a string of OBJECTS, the MONAD engine converts those objects to strings before passing them to Match-String.&amp;nbsp; Thus the following 2 commands are functionaly equivalent:&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;FONT face="Courier New" size=2&gt;get-alias | match-string "ri"&lt;BR&gt;get-alias | foreach {"$_"} |match-string "ri"&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;Converting an object to a string is accomplished by call that object's ToString() method (vs using MONAD's formating subsystem).&amp;nbsp; Notice the difference - the first uses Monad's formating and the second is the object's ToString()&amp;nbsp;&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; (gal ri)&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;FONT face="Courier New" size=2&gt;CommandType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Definition&lt;BR&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ri&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove-item&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; (gal ri).ToString()&lt;BR&gt;ri&lt;BR&gt;MSH&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;If you wanted Match-String to work on the Monad formatted output, you'll need to get that as a string.&amp;nbsp; Here is the thing to grok about our outputing.&amp;nbsp; When your command sequence emits a stream of strings, we emit it without processing.&amp;nbsp; If&amp;nbsp; instead, your command sequence emits a stream of objects, then we redirect those objects to the command Out-Default.&amp;nbsp; Out-Default looks at the type of the object and the registered formating metadata to see if there is a default view for that object type.&amp;nbsp; A view defines a FORMATTER and the metadata for that command.&amp;nbsp; Most objects get vectored to either Format-Table or Format-List (though they could go to Format-Wide or Format-Custom).&amp;nbsp; THESE FORMATTERS DO &lt;STRONG&gt;NOT&lt;/STRONG&gt; EMIT STRINGS!&amp;nbsp; You can see this for yourself by the following: &lt;/P&gt;
&lt;P dir=ltr&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; gps |ft |group {$_.GetType().name} |ft Count,Name -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;FONT face="Courier New" size=2&gt;Count Name&lt;BR&gt;----- ----&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 FormatStartData&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 GroupStartData&lt;BR&gt;&amp;nbsp;&amp;nbsp; 53 FormatEntryData&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 GroupEndData&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 FormatEndData&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;These formating records are then vectored to an OUT-xxx command to be rendered into the appropriate data for a particular output device.&amp;nbsp; By default, they go to Out-Host but you can pipe this to Out-File, Out-Printer or Out-String.&amp;nbsp; (NOTE: these OUT-xxx commands are pretty clever, if you pipe formating objects to them, they'll render them.&amp;nbsp; If you pipe raw object to them, they'll first call the appropriate formatter and then render them.)&lt;/P&gt;
&lt;P dir=ltr&gt;So to make match-string work against the string version of Monad's output, you'd do this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; get-alias | out-string -stream | match-string "ri"&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clv&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clear-variable&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gdr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get-drive&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gv&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get-variable&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ndr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new-drive&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nv&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new-variable&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rdr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove-drive&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ri&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove-item&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rv&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove-variable&lt;BR&gt;...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Notice a couple things 1) you had to say "Out-String -STREAM" (if you didn't say -STREAM you would have gotten a single string) 2) now match-string matches any line that has an "ri" in it not just the ones where&amp;nbsp;the NAME&amp;nbsp;has an "ri" in it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Think about the last statement 'just the ones where the NAME has an "ri" in it'.&amp;nbsp; One of the things we designed Monad to do was to give you an experience where you think it, you type it, you get it.&amp;nbsp; So let's say it, "I want to GET the ALIASes WHERE the NAME matches the string RI".&amp;nbsp; Now lets type it:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; GET-ALIAS |WHERE {$_.NAME -match "ri"}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;CommandType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Definition&lt;BR&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ri&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove-item&lt;BR&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-object&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;It take a while to stop thinking in terms of streams of text and start thinking in terms of streams of objects.&amp;nbsp; The benefit is that once you do this, you begin to ask questions in a way that makes it really easy to answer.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;P&gt;Jeffrey Snover&lt;BR&gt;Monad Architect&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=577013" width="1" height="1"&gt;</description></item><item><title>Is it safe to use ALIASES in scripts?</title><link>http://blogs.msdn.com/monad/archive/2006/04/15/576996.aspx</link><pubDate>Sat, 15 Apr 2006 23:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:576996</guid><dc:creator>Monad Team</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/monad/comments/576996.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=576996</wfw:commentRss><description>&lt;P&gt;In&amp;nbsp;our newsgroup (Microsoft.Public.Windows.Server.Scripting) , Mark Ayers asked the question:&lt;BR&gt;&amp;gt; Shouldn't best practice for scripts be full command name?&lt;/P&gt;
&lt;P&gt;The answer is YES, NO, and MAYBE.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;YES &lt;/STRONG&gt;- Full names provide the most readable experience for scripts.&amp;nbsp; This is very important.&amp;nbsp; People&amp;nbsp;often throw the rock at Perl saying that it is a "write-only language" meaning that after you write a script, you can't read it or understand what it does.&amp;nbsp; We believe that Monad scripts will be widely shared and will be used in environments where it is really important to know exactly what is going on.&amp;nbsp; As such, script readability has always been a strong focus for us.&amp;nbsp; This is one of the key reasons why we support both a pithy and verbose invocation model (pithy for high-speed interactive use, verbose for scripting).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;NO &lt;/STRONG&gt;- Not all aliases are the same.&amp;nbsp; There are a special class of aliases that are READONLY and ALLSCOPE.&amp;nbsp; You can find these with the following command:&lt;/P&gt;
&lt;P&gt;gal | where {""+$_.options -match "Readonly" } | ft name, definition, options -auto&lt;/P&gt;
&lt;P&gt;Take a look at how regular and predictable these are:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; gal g* | where {""+$_.options -match "Readonly" } |&lt;BR&gt; ft name, definition, options -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Name&amp;nbsp; Definition&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Options&lt;BR&gt;----&amp;nbsp; ----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;gal&amp;nbsp;&amp;nbsp; get-alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gc&amp;nbsp;&amp;nbsp;&amp;nbsp; get-content&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gci&amp;nbsp;&amp;nbsp; get-childitem ReadOnly, AllScope&lt;BR&gt;gcm&amp;nbsp;&amp;nbsp; get-command&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gdr&amp;nbsp;&amp;nbsp; get-drive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;ghy&amp;nbsp;&amp;nbsp; get-history&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gi&amp;nbsp;&amp;nbsp;&amp;nbsp; get-item&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gl&amp;nbsp;&amp;nbsp;&amp;nbsp; get-location&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gm&amp;nbsp;&amp;nbsp;&amp;nbsp; get-member&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gp&amp;nbsp;&amp;nbsp;&amp;nbsp; get-property&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gps&amp;nbsp;&amp;nbsp; get-process&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;group group-object&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gsv&amp;nbsp;&amp;nbsp; get-service&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gu&amp;nbsp;&amp;nbsp;&amp;nbsp; get-unique&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gv&amp;nbsp;&amp;nbsp;&amp;nbsp; get-variable&amp;nbsp; ReadOnly, AllScope&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; gal ?v | where {""+$_.options -match "Readonly" } |&lt;BR&gt; ft name, definition, options -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Name Definition&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Options&lt;BR&gt;---- ----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;gv&amp;nbsp;&amp;nbsp; get-variable&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;nv&amp;nbsp;&amp;nbsp; new-variable&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;rv&amp;nbsp;&amp;nbsp; remove-variable ReadOnly, AllScope&lt;BR&gt;sv&amp;nbsp;&amp;nbsp; set-variable&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; gal n* | where {""+$_.options -match "Readonly" } |&lt;BR&gt; ft name, definition, options -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Name Definition&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Options&lt;BR&gt;---- ----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;nal&amp;nbsp; new-alias&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;ndr&amp;nbsp; new-drive&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;ni&amp;nbsp;&amp;nbsp; new-item&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;nv&amp;nbsp;&amp;nbsp; new-variable ReadOnly, AllScope&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;MSH&amp;gt; gal *al | where {""+$_.options -match "Readonly" } | ft name, definition, options -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Name Definition&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Options&lt;BR&gt;---- ----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;epal export-alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;gal&amp;nbsp; get-alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;ilal initialize-alias ReadOnly, AllScope&lt;BR&gt;ipal import-alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;nal&amp;nbsp; new-alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;BR&gt;sal&amp;nbsp; set-alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly, AllScope&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;In previous drops, these aliases where CONSTANT which meant that users could not delete or remove them.&amp;nbsp; They exist because they are very predictable and pithy short hands for the long names.&amp;nbsp; We made them constant so that you could feel safe using them in any script and that you could share that script with other people knowing that you were guaranteed that those aliases would exist everywhere and mean the same thing so your scripts would not break.&amp;nbsp; The community provided strong feedback that MSFT should not ship any CONSTANT aliases so we made them READONLY and ALLSCOPE.&amp;nbsp; This means that you can remove them (using the -FORCE flag) and create your own definitions but it is strongly discouraged.&lt;/P&gt;
&lt;P&gt;So in the end, you are pretty safe using the aliases that are READONLY and CONSTANT.&amp;nbsp; You might argue that this is less safe then using the full command name.&amp;nbsp; This would not be correct.&amp;nbsp; Token resolution works by first expanding aliases then binding to a function, then a cmdlet, lastly as an external executable.&amp;nbsp; When you type "Get-Process"&amp;nbsp; - it could have been aliased to any other command or there could be a function with this name.&amp;nbsp;So in the end, the READONLY ALLSCOPE aliases are just about as safe as the full command names.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;MAYBE.&amp;nbsp; &lt;/STRONG&gt;The other thing you can do in your script is to set up the aliases you'll use yourself.&amp;nbsp; Aliases are scoped so this is generally a safe operation and will not contaminate the users environment.&amp;nbsp; Let me demonstrate using a one of my favorite functions that I define in my profile file, Start-NewScope and its alias sans&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;function Start-NewScope &lt;BR&gt;{&lt;BR&gt;param($Prompt = $null) Write-Host "Starting New Scope"&lt;BR&gt;&amp;nbsp; if ($Prompt -ne $null)&lt;BR&gt;&amp;nbsp; {&amp;nbsp; if ($Prompt -is [ScriptBlock])&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $null = New-Item function:Prompt -Value $Prompt -force&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; function Prompt {"$Prompt"}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; $host.EnterNestedPrompt()&lt;BR&gt;}&lt;BR&gt;sal sans Start-NewScope&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;BTW - every time you enter a nested prompt, $NESTEDPROMPTLEVEL is incremented so I include this information in my prompt:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;function prompt&lt;BR&gt;{&lt;BR&gt;"[{0}:{1}]MSH&amp;gt; " -f $PID, $NestedPromptLevel&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;So watch that as I create and exit new scopes.&amp;nbsp; I'll create a new scope, redefine some aliases and then exit the scope and show how those aliases are cleaned up and the old aliases are now in scope.&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;[3312:0]MSH&amp;gt; gal write |ft name,definition -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Name&amp;nbsp; Definition&lt;BR&gt;----&amp;nbsp; ----------&lt;BR&gt;write write-object&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;[3312:0]MSH&amp;gt; write test&lt;BR&gt;test&lt;BR&gt;&lt;BR&gt;# NOW WE START A NEW SCOPE AND REDEFINE WRITE&lt;BR&gt;[3312:0]MSH&amp;gt; sans&lt;BR&gt;Starting New Scope&lt;BR&gt;[3312:1]MSH&amp;gt; sal write write-error&lt;BR&gt;[3312:1]MSH&amp;gt; write test&lt;BR&gt;write test : test&lt;BR&gt;[3312:1]MSH&amp;gt; gal write |ft name,definition -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Name&amp;nbsp; Definition&lt;BR&gt;----&amp;nbsp; ----------&lt;BR&gt;write write-error&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;# NOW WE EXIT THE SCOPE WHICH REMOVES THIS ALIAS &lt;BR&gt;# WHICH NOW REVEALS THE PREVIOUS DEFINITION&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;[3312:1]MSH&amp;gt; exit&lt;BR&gt;[3312:0]MSH&amp;gt; write test&lt;BR&gt;test&lt;BR&gt;[3312:0]MSH&amp;gt; gal write |ft name,definition -auto&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Name&amp;nbsp; Definition&lt;BR&gt;----&amp;nbsp; ----------&lt;BR&gt;write write-object&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;P&gt;Jeffrey Snover&lt;BR&gt;Monad Architect&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=576996" width="1" height="1"&gt;</description></item><item><title>Verb-Noun vs Noun-Verb</title><link>http://blogs.msdn.com/monad/archive/2006/04/12/575056.aspx</link><pubDate>Wed, 12 Apr 2006 16:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:575056</guid><dc:creator>Monad Team</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/monad/comments/575056.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=575056</wfw:commentRss><description>&lt;P&gt;Kurt asked the question "why not Noun-Verb vs Verb-Noun" in his post: &lt;A HREF="/monad/archive/2006/02/16/533522.aspx#574708"&gt;http://blogs.msdn.com/monad/archive/2006/02/16/533522.aspx#574708&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;There are lots of answers to this some better than others.&amp;nbsp; Let me rattle off a couple of them:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;VMS DCL/AS400&lt;/STRONG&gt;.&amp;nbsp; Issac Newton once said&amp;nbsp;that if he could see farther, it was because he was standing on the shoulders of giants.&amp;nbsp; So it is with Monad.&amp;nbsp; People like to point out the similarities between Monad and various UNIX shells/utilities and scripting languages.&amp;nbsp; Absolutely true - many of us have&amp;nbsp;deep UNIX backgrounds and &amp;nbsp;have a lot of respect for that body of work.&amp;nbsp; That said, Monad is influenced as much by VMS/DCL and&amp;nbsp;AS400/CL&amp;nbsp;as it is UNIX.&amp;nbsp; These are wonderful environments built with the clear vision that they would be used by people running production shops where operations and management really mattered.&amp;nbsp; These environments are strict about naming guidelines, common syntax, environmental setup, operational characteristics, etc etc.&amp;nbsp; &lt;BR&gt;&lt;BR&gt;Both of these environments are hard core about naming and leverage a Verb-Noun pattern.&amp;nbsp; Apollo's Domain/OS and AIX also used Verb-Noun models as well.&amp;nbsp; BTW - you can see the influences of the VMS &amp;amp; AS400&amp;nbsp;focus on production qualities in:&amp;nbsp; having a single common command line parser,&amp;nbsp; -VERBOSE, -CONFIRM, -ERRORACTION (actually our entire near-manical focus on error handling comes from a focus on production readiness), and others.&lt;BR&gt;&lt;BR&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Programmer vs Admin focus&lt;/STRONG&gt;.&amp;nbsp; Kurt points out that a Noun-Verb schema would mirror the OO programming world.&amp;nbsp; That is another reason we are Verb-Noun.&amp;nbsp; There are 2 aspects to this:&lt;/LI&gt;
&lt;OL&gt;
&lt;LI&gt;Admins are admins with needs similar but&amp;nbsp;distinctly different from those of programmers.&amp;nbsp; We already have world-class languages and tools for programmers, what we need improvement on is Admin languages and tools.&amp;nbsp; I did not want teams thinking that they could just expose their .NET objects and think that they were meeting the needs of admins.&amp;nbsp; These teams need to think about the needs of admins and provide consistent, high level, task-oriented, set-oriented operations with a strong focus on error handling and operational control.&amp;nbsp; You can easily do that with a thin layer on top of .NET objects but you can't get that by just exposing .NET objects.&amp;nbsp; So being Verb-Noun helps drive home this point.&lt;/LI&gt;
&lt;LI&gt;Take a look at the inconsistency of Method names on .net objects.&amp;nbsp; It is Kill() for a process object but Stop() on a serviceController object.&amp;nbsp; Putting the noun first puts people in the mindset that their domain is the high order bit and they pick methodnames optimized for their domain.&amp;nbsp; Putting the Verb first makes it clear that the User Experience is the high order bit and the domain specifics are the low order bit.&amp;nbsp; We want an very high level of verb reuse to provide a consistent, predictable user-experience.&amp;nbsp; &lt;/LI&gt;&lt;/OL&gt;&lt;/OL&gt;
&lt;P&gt;Jeffrey P. Snover&lt;BR&gt;Monad Architect&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=575056" width="1" height="1"&gt;</description></item><item><title>Monitor the Event Log</title><link>http://blogs.msdn.com/monad/archive/2006/04/10/572665.aspx</link><pubDate>Mon, 10 Apr 2006 21:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:572665</guid><dc:creator>Monad Team</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/monad/comments/572665.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=572665</wfw:commentRss><description>&lt;P&gt;Administrators often want to monitor the event logs and look for specific error conditions.&amp;nbsp; The most capable way to do this, of course, is to use a dedicated monitoring application such as &lt;A href="http://www.microsoft.com/mom/"&gt;Microsoft Operations Manager&lt;/A&gt;, or get down-and-dirty with the Win32 API &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/eventlog/base/receiving_event_notification.asp"&gt;NotifyChangeEventLog&lt;/A&gt;.&amp;nbsp; However, Monad can be used for simple applications.&lt;/P&gt;
&lt;P&gt;Suppose you are looking for event ID 4226 in the System log.&amp;nbsp; The trivial way to do this is "&lt;FONT face="Courier New"&gt;get-eventlog System | where {$_.EventID -eq 4226}&lt;/FONT&gt;", but this has two problems:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;This will report the same errors every time you run it, no matter how old they get, until they are cleared from the log. 
&lt;LI&gt;Event logs can contain literally millions of events.&amp;nbsp; So, a simple script like this might work on your test server, but could get completely bogged down on your production servers.&amp;nbsp; If you are building software to be distributed to customers whose log configuration you do not control, this is almost certainly unacceptable.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;For these reasons, you may want to be a little more clever about searching the event log.&amp;nbsp; Here is a script which searches logs incrementally, keeping track each time of the log index it reached last time and only reporting new hits.&amp;nbsp; The log position is stored in a content object, by default file "&amp;lt;home&amp;gt;\System_Position.txt".&amp;nbsp; Because this content object is only accessed using get-content and set-content, it doesn't have to be a file; it could be an item from any provider implementing IContentCmdletProvider!&amp;nbsp; The output objects are the same as get-eventlog, so no additional formatting directives are needed.&lt;/P&gt;
&lt;P&gt;There are five script parameters:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;-LogName is the script you want to read, by default "System". 
&lt;LI&gt;-Filter is the filter which identifies the events you want.&amp;nbsp; This should be expressed as a script block which gets an EventLogEntry as "$_" and yields a boolean value.&amp;nbsp; By default this is "{$true}" which means output all entries. 
&lt;LI&gt;-PositionFile is the path to the content object which keeps track of the last checked position, by default "&amp;lt;home&amp;gt;\&amp;lt;LogName&amp;gt;_position.txt". 
&lt;LI&gt;-Force:&amp;nbsp; If specified, continue with the operation even if the current content object does not exist or is invalid.&amp;nbsp; All "[switch]" parameters are false by default; you can just specify "-Force" to make it true, or "-Force:$var" to set it to a shell variable value. 
&lt;LI&gt;-Restart:&amp;nbsp; If specified, create a new position file and start from the beginning of the log.&amp;nbsp; You will need to use -Restart the first time to create the position file.&amp;nbsp; This is a "[switch]" parameter like -Force.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;One line of this script is of particular interest:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # This line actually generates the output&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $entry | where $Filter&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;If the scriptblock in $Filter evaluates to true, then the entry will be written to the script's output stream.&amp;nbsp; The scriptblock will evaluate in the same scope as the script as a whole; to achieve better isolation between the user-provided scriptblock and the main script,&amp;nbsp;"&lt;FONT face="Courier New"&gt;where {&amp;amp;$Filter}&lt;/FONT&gt;" will create a new scope every time.&lt;/P&gt;
&lt;P&gt;Also note the use of the write-debug, write-warning, and write-verbose cmdlets in the script.&amp;nbsp; Script users can set $DebugPreference, $VerbosePreference, and/or $WarningPreference to see this text when desired.&lt;/P&gt;
&lt;P&gt;A little domain-specific information about the EventLog is required to fully understand this script.&amp;nbsp; First, we check EventLogEntry.Index to determine whether an entry has already been seen, rather than EventLogEntry.TimeGenerated or the like.&amp;nbsp; Remember that the system clock can be modified at any time (e.g. if the user determines that it is running fast), whereas the Index will reliably increment until the log is cleared.&amp;nbsp; Second, we also remember the TimeGenerated of the newest log entry in the position file.&amp;nbsp; This enables us to detect when the log has been cleared, which is important since new entries will have Index starting from 1 after the reset.&lt;/P&gt;
&lt;P&gt;Further features could probably be added to this script, for example, a way to initialize a position file to the current position so that you don't ever have to read the entire log.&lt;/P&gt;
&lt;P&gt;Thanks to Bruce Payette and Jim Truher for their help with the script.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;P&gt;Jon Newman [MSFT]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;# Eventlog monitoring script 2006/03/28 JonN&lt;BR&gt;#&lt;BR&gt;# Event logs can contain hundreds of thousands of items, so&lt;BR&gt;# "get-eventlog System | where {&amp;lt;condition&amp;gt;}" can take excessively long&lt;BR&gt;# on production systems.&amp;nbsp; Plus, the same failures will be reported&lt;BR&gt;# over and over.&lt;BR&gt;# This script will remember your last Index position in the log,&lt;BR&gt;# and only report events which occurred since then.&lt;BR&gt;# It also remembers the TimeGenerated of the oldest log entry,&lt;BR&gt;# so that it can detect when the log has been cleared.&lt;BR&gt;# Example:&lt;BR&gt;# eventlog.msh1 -LogName System -Filter {$_.EventID -eq 4226} -PositionFile "c:\logs\syslogpos.txt"&lt;/P&gt;
&lt;P&gt;param (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [string]$LogName = "System",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ScriptBlock]$Filter = {$true},&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [string]$PositionFile = $home + "\" + $LogName + "_position.txt",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [switch]$Force,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [switch]$Restart&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/P&gt;
&lt;P&gt;write-debug "`$LogName = $LogName"&lt;BR&gt;write-debug "`$Filter = '$Filter'"&lt;BR&gt;write-debug "`$PositionFile = '$PositionFile'"&lt;BR&gt;write-debug "`$Force = $Force"&lt;BR&gt;write-debug "`$Restart = $Restart"&lt;/P&gt;
&lt;P&gt;[int]$lastCheckedIndex = -1&lt;BR&gt;[DateTime]$lastCheckedTime = [DateTime]::MaxValue&lt;/P&gt;
&lt;P&gt;if (!$Restart)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $filecontent = get-content $PositionFile -ea SilentlyContinue&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($null -eq $filecontent)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$Force)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;throw "Position file '$PositionFile' does not exist or could not be opened. Use -Force or -Restart to create a new position file."&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-verbose "Position file '$PositionFile' does not exist or could not be opened.&amp;nbsp; Rebuilding position file because -Force was specified."&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-debug "Position file contains '$filecontent'"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trap {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($Force)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-warning "Content of position file '$PositionFile' is invalid.&amp;nbsp; Rebuilding position file because -Force was specified."&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $lastCheckedIndex = -1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $lastCheckedTime = [DateTime]::MaxValue&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;throw "Content of position file '$PositionFile' is invalid.&amp;nbsp; Terminating operation.&amp;nbsp; Use -Force or -Restart to rebuild the position file."&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # These lines will throw if the cast fails&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $lastCheckedIndex = $filecontent[0]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $lastCheckedTime = $filecontent[1]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;write-debug "`$lastCheckedIndex = $lastCheckedIndex"&lt;BR&gt;write-debug "`$lastCheckedTime = $lastCheckedTime"&lt;/P&gt;
&lt;P&gt;# I don't simply call get-eventlog $LogName because I don't want to&lt;BR&gt;# build an array with all the hundreds of thousands of event log entries.&lt;BR&gt;# Instead, I make sure the EventLogEntryCollection is not unrolled.&lt;BR&gt;$log = get-eventlog -List | where {$_.Log -ieq $LogName}&lt;BR&gt;if ($null -eq $log)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw "Log not found: $LogName"&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;$entries = $log.Entries&lt;BR&gt;if (0 -eq $entries.Count)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-debug "Log empty: $LogName"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;$oldestEntryTime = $entries[0].TimeGenerated&lt;BR&gt;if ($oldestEntryTime -gt $lastCheckedTime)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-verbose "The log appears to have been cleared since it was last checked: $LogName."&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $lastCheckedIndex = -1&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;# The index can diverge from the number of entries&lt;BR&gt;# when the log reaches its maximum size and is configured&lt;BR&gt;# to "Overwrite entries as needed"&lt;BR&gt;$newestEntryIndex = $entries[$entries.Count - 1].Index&lt;BR&gt;$newestEntryTime = $entries[$entries.Count - 1].TimeGenerated&lt;/P&gt;
&lt;P&gt;write-debug "Newest entry in log has index $newestEntryIndex"&lt;BR&gt;write-debug "Newest entry in log has TimeGenerated $newestEntryTime"&lt;/P&gt;
&lt;P&gt;# $entries.Count could be more than the maximum range "50000 .. 0"&lt;BR&gt;foreach ($i in ($entries.Count - 1) .. 0)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $entry = $entries[$i]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($entry.Index -le $lastCheckedIndex) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # This line actually generates the output&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $entry | where $Filter&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;write-debug "Writing index $newestEntryIndex to position file '$PositionFile'"&lt;BR&gt;write-debug "Writing time $newestEntryTime to position file '$PositionFile'"&lt;BR&gt;$newestEntryIndex,$newestEntryTime | set-content $PositionFile&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=572665" width="1" height="1"&gt;</description></item><item><title>Base64 Encode/Decode a string</title><link>http://blogs.msdn.com/monad/archive/2006/03/27/562100.aspx</link><pubDate>Mon, 27 Mar 2006 19:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:562100</guid><dc:creator>Monad Team</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/monad/comments/562100.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=562100</wfw:commentRss><description>&lt;P&gt;Today I came across &lt;A href="http://scripts.readify.net/"&gt;http://scripts.readify.net/&lt;/A&gt;&amp;nbsp; . This sight is focused on Monad and MSH and is starting a collection of scripts at: &lt;A href="http://scripts.readify.net/Scripts.aspx"&gt;http://scripts.readify.net/Scripts.aspx&lt;/A&gt;&amp;nbsp;.&amp;nbsp; You should visit their site and let them know what type of scripts would be useful to you.&amp;nbsp; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;I particularly liked their entry on how to Base64 encode a file.&amp;nbsp; This is something that I need occassionally and I can never remember how to do it.&amp;nbsp; I was about to include it as-is into my profile and decided that there was a better way to do this.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;lt;IMPORTANT POINT&amp;gt; &lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Whenever you are adding some functions, you should make a conscious decision about whether those functions are best exposed as a "function" or as a "type extension".&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&amp;lt;/IMPORTANT POINT&amp;gt;&lt;/P&gt;
&lt;P&gt;Both of these mechanisms are great and have their purpose but my observation is that people are not using type-extensions as much as they should.&amp;nbsp; One of the huge benefits of type extensions is discoverability.&amp;nbsp; Let me show you how to do this function as a type-extension and highlight the benefits of this approach.&lt;/P&gt;
&lt;P&gt;When doing a type extension, you first need to decide what TYPE you are going to extend.&amp;nbsp; In this case, I decided that I would extend SYSTEM.STRING as that was the most general purpose type for this function.&amp;nbsp; I then encoded the following in a file called My.Types.Mshxml&lt;/P&gt;
&lt;P&gt;&amp;lt;/Types&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Type&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;System.String&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Members&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;ToBase64String&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [System.Convert]::ToBase64String([System.Text.Encoding]::UNICODE.GetBytes($this))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;FromBase64String&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [System.Text.Encoding]::UNICODE.GetString([System.Convert]::FromBase64String($this))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/GetScriptBlock&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScriptProperty&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Members&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Type&amp;gt;&lt;BR&gt;&amp;lt;/Types&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In my profile I load this file via the command:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;Update-TypeData c:\msh\My.Types.mshxml&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Once I do that, these properties are available to any STRING and can be discovered via Get-Member:&lt;/P&gt;
&lt;P&gt;MSH&amp;gt; &lt;STRONG&gt;$x="Hello World"&lt;BR&gt;&lt;/STRONG&gt;MSH&amp;gt;&lt;STRONG&gt; $x |Get-Member&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; TypeName: System.String&lt;/P&gt;
&lt;P&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemberType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Definition&lt;BR&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&lt;BR&gt;Clone&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object Clone()&lt;BR&gt;CompareTo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32 CompareTo(Object value), System.Int32 CompareTo(String strB)&lt;BR&gt;Contains&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean Contains(String value)&lt;BR&gt;CopyTo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Void CopyTo(Int32 sourceIndex, Char[] destination, Int32 destinationIndex, Int32 count)&lt;BR&gt;EndsWith&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean EndsWith(String value), System.Boolean EndsWith(String value, StringComparison comparisonType), System.Boolean EndsWith(String value, Boolean ignoreCase, CultureInfo culture)&lt;BR&gt;...&lt;/P&gt;
&lt;P&gt;Trim&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String Trim(Params Char[] trimChars), System.String Trim()&lt;BR&gt;TrimEnd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String TrimEnd(Params Char[] trimChars)&lt;BR&gt;TrimStart&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String TrimStart(Params Char[] trimChars)&lt;BR&gt;Chars&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParameterizedProperty System.Char Chars(Int32 index) {get;}&lt;BR&gt;Length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32 Length {get;}&lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;FromBase64String&lt;/STRONG&gt; ScriptProperty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object FromBase64String {get=[System.Text.Encoding]::UNICODE.GetString([System.Convert]::FromBase64String($this));}&lt;BR&gt;&lt;STRONG&gt;ToBase64String&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp; ScriptProperty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object ToBase64String {get=[System.Convert]::ToBase64String([System.Text.Encoding]::UNICODE.GetBytes($this));}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;MSH&amp;gt; &lt;STRONG&gt;$x&lt;BR&gt;&lt;/STRONG&gt;Hello World&lt;BR&gt;MSH&amp;gt; &lt;STRONG&gt;$x.ToBase64String&lt;/STRONG&gt;&lt;BR&gt;SABlAGwAbABvACAAVwBvAHIAbABkAA==&lt;BR&gt;MSH&amp;gt;&lt;STRONG&gt; $x.ToBase64String.FromBase64String&lt;BR&gt;&lt;/STRONG&gt;Hello World&lt;BR&gt;MSH&amp;gt; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;P&gt;Jeffrey Snover&lt;BR&gt;Monad Architect&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=562100" width="1" height="1"&gt;</description></item><item><title>GetObject() </title><link>http://blogs.msdn.com/monad/archive/2006/03/26/561337.aspx</link><pubDate>Sun, 26 Mar 2006 18:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:561337</guid><dc:creator>Monad Team</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/monad/comments/561337.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=561337</wfw:commentRss><description>&lt;P&gt;Monad provides a way to create new com objects with new-object&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;$ie = New-Object -ComObject InternetExplorer.Application&lt;BR&gt;$ie.Navigate2(&lt;/FONT&gt;&lt;A HREF="/monad"&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;http://blogs.msdn.com/monad&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;)&lt;BR&gt;$ie.Visible=1&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Great but what about if you want to bind to an existing object?&amp;nbsp; Where is the equivalent of GetObject()?&lt;/P&gt;
&lt;P&gt;This is one of those good new/bad news stories.&amp;nbsp; First the bad news.&amp;nbsp; Monad does not provide a Cmdlet that exposes this function.&amp;nbsp; Alas, to ship is to choose and we are not going to get to in for V1.&amp;nbsp; Now for the good news.&amp;nbsp; Monad provides great .NET support and .NET exposes this function.&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT color=#ff0000&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=1&gt;&lt;FONT color=#ff0000&gt;MSH&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;&amp;gt; $w=[System.Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;/SPAN&gt;&lt;FONT color=#ff0000&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;MSH&amp;gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt; $w.documents |ft name,path -auto&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;Name&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" color=#ff0000 size=1&gt;Path&lt;/FONT&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT size=1&gt;&lt;FONT color=#ff0000&gt;----&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;----&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=1&gt;&lt;FONT color=#ff0000&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT color=#ff0000&gt;RE: Question regarding Word scripting with MSH... RE:&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT color=#ff0000&gt;cmdlets as classes.doc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="file://imself-dfs-07/dfsroot/dfsmydocs/js...Event"&gt;\\imself-dfs-07\dfsroot\dfsmydocs\js...&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;Event&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt; Schema.doc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \\imself-dfs-07\dfsroot\dfsmydocs\js..&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#ff0000&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;Let me be quick to point out a problem that exists in your beta code but is fixed in the upcoming release.&amp;nbsp; If you just typed $w.Documents - it is going to appear to have hung and you'll either have to wait a&amp;nbsp;LONG time or hit CTRL-BREAK to terminate the session.&amp;nbsp; The work around is very simple, pipe the output to Get-Member and use that to find out what properties you want and then ask for those specific properties.&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;Anyway, this is an example of how Monad's support for a wide range of technologies (text processing, COM, WMI, ADSI, ADO, XML, .NET, etc) really pays off.&amp;nbsp; As a rule, we are trying to expose the system with Cmdlet and namespace semantics.&amp;nbsp; It is going to take a while before the entirety of the system is exposed this way but by providing direct access to these other technologies, it enables the community to provide this support.&amp;nbsp; For example the function:&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;Function Get-Object ($ProgID) {&lt;/FONT&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT face="Courier New" color=#ff0000 size=1&gt;[System.Runtime.InteropServices.Marshal]::GetActiveObject($ProgID)&lt;BR&gt;}&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;and the following formating directives:&lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT color=#ff0000&gt;&amp;lt;Configuration&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ViewDefinitions&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;View&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;CustomView&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ViewSelectedBy&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TypeName&amp;gt;System.__ComObject#{0002096b-0000-0000-c000-000000000046}&amp;lt;/TypeName&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ViewSelectedBy&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableControl&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableHeaders&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableColumnHeader&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Label&amp;gt;Name&amp;lt;/Label&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Width&amp;gt;20&amp;lt;/Width&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableColumnHeader&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableColumnHeader&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Label&amp;gt;FullName&amp;lt;/Label&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableColumnHeader&amp;gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#ff0000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;&amp;lt;/TableHeaders&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableRowEntries&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableRowEntry&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableColumnItems&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableColumnItem&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PropertyName&amp;gt;Name&amp;lt;/PropertyName&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableColumnItem&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TableColumnItem&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PropertyName&amp;gt;FullName&amp;lt;/PropertyName&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableColumnItem&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableColumnItems&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableRowEntry&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableRowEntries&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TableControl&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/View&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ViewDefinitions&amp;gt;&lt;BR&gt;&amp;lt;/Configuration&amp;gt;&lt;/FONT&gt; &lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;allows us to do the following:&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT color=#ff0000&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT color=#ff0000&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;MSH&amp;gt; $w = Get-Object -ProgId Word.Application&lt;BR&gt;&lt;/STRONG&gt;&lt;FONT color=#ff0000&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT color=#ff0000&gt;MSH&amp;gt; $w.documents&lt;/FONT&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=1&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;Fullname&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT size=1&gt;&lt;FONT color=#ff0000&gt;----&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#ff0000&gt;--------&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT color=#ff0000 size=1&gt;RE: Question regarding Word scripting with MSH... RE:&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT color=#ff0000 size=1&gt;cmdlets as classes.doc&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="file://imself-dfs-07/dfsroot/dfsmydocs/js...Event"&gt;&lt;FONT color=#ff0000&gt;\\imself-dfs-07\dfsroot\dfsmydocs\js...&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;FONT color=#ff0000&gt;Event&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#ff0000&gt; Schema.doc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;A href="file://imself-dfs-07/dfsroot/dfsmydocs/js"&gt;&lt;FONT color=#ff0000&gt;\\imself-dfs-07\dfsroot\dfsmydocs\js&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#ff0000&gt;...&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT face=Courier color=navy size=1&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT face=Courier color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;Extend the system and Enjoy!&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT face=Courier color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Courier"&gt;Jeffrey P. Snover&lt;BR&gt;Monad Architect&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/P&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=561337" width="1" height="1"&gt;</description></item><item><title>Finding out what determines which properties are displayed</title><link>http://blogs.msdn.com/monad/archive/2006/03/22/558195.aspx</link><pubDate>Wed, 22 Mar 2006 21:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:558195</guid><dc:creator>Monad Team</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/monad/comments/558195.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=558195</wfw:commentRss><description>&lt;P&gt;MoW, a Monad newsgroup regular, asked why only the Caption, Name and PeakUsage properties were displayed from the command “get-WMIObject Win32_PageFileUsage” while the output object had a lot more properties. I think it is worth it to explain in details how to find out which properties are displayed.&lt;BR&gt;First, I would look at which view defined in one of the *.format.msh1xml files is used. The Trace-Command Cmdlet can help here:&lt;BR&gt;Trace-Command –option All –Name FormatViewBinding { get-WMIObject Win32_PageFileUsage | out-host} –MshHost&lt;/P&gt;
&lt;P&gt;The trace output is in yellow. It reads at the end: “DEBUG: FormatViewBindin Information: 0 : No applicable view has been found.” Now, I know that no view is used. The next place to look is the types.msh1xml file. In this file, each type description can have a node called DefaultDisplayPropertySet where the default display properties are defined. Since the class in question is Win32_PageFileUsage, we can search for the string in notepad. Here is the section for the class.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Type&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;System.Management.ManagementObject#root\cimv2\Win32_PageFileUsage&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Members&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PropertySet&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;MshStatus&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ReferencedProperties&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Status&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Name&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;CurrentUsage&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ReferencedProperties&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/PropertySet&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;MemberSet&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;MshStandardMembers&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Members&amp;gt;&lt;BR&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PropertySet&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;DefaultDisplayPropertySet&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ReferencedProperties&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Caption&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Name&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;PeakUsage&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ReferencedProperties&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/PropertySet&amp;gt;&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Members&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/MemberSet&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Members&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Type&amp;gt;&lt;/P&gt;
&lt;P&gt;Under the DefaultDisplayPropertySet node, there are Caption, Name, and PeakUsage. The question is answered.&lt;/P&gt;
&lt;P&gt;- Kevin[MSFT]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=558195" width="1" height="1"&gt;</description></item><item><title>Dynamically loading assemblies in mshsnapins.</title><link>http://blogs.msdn.com/monad/archive/2006/03/16/552404.aspx</link><pubDate>Thu, 16 Mar 2006 02:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:552404</guid><dc:creator>Monad Team</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/monad/comments/552404.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=552404</wfw:commentRss><description>&lt;P&gt;In Monad, mshsnapins can be installed in a different directory from the Monad executables. At runtime, the Monad engine will load the mshsnapin assembly and its referenced assemblies based on application base information&amp;nbsp;provided during&amp;nbsp;mshsnapin installation. &lt;/P&gt;
&lt;P&gt;If an mshsnapin itself dynamically loads an assembly through an assembly name or a relative path, however, CLR may not be able to locate the assembly.&amp;nbsp; This is&amp;nbsp;because the CLR runtime knows nothing about the mshsnapin installation directory and thus will not search there&amp;nbsp;during dynamic assembly resolution.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The following is a&amp;nbsp;common scenario for this: &amp;nbsp;Assume&amp;nbsp;that an mshsnapin named "mysnapin" is installed in the c:\mysnapin directory and the monad executable is installed in c:\monad\ directory. Also assume that cmdlet "my-command" in "mysnapin" will dynamically load another assembly like this, (assume mylibrary.dll sits in the same directory as "mysnapin" assembly)&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;Assembly.LoadFrom("mylibrary.dll");&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;If you run "my-command" in msh.exe, you will get an error indicating that mylibrary.dll can't be found. The reason for this is that CLR runtime only searchs through the&amp;nbsp;GAC and the currently executable directory (which is installation directory for msh.exe) for assembly resolution. &lt;/P&gt;
&lt;P dir=ltr&gt;If you want to dynamically load an assembly in your mshsnapin, always provide an absolute path unless the assembly itself is in GAC. &lt;/P&gt;
&lt;P dir=ltr&gt;-George[MSFT]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=552404" width="1" height="1"&gt;</description></item><item><title>Working with Sort-Object Cmdlet</title><link>http://blogs.msdn.com/monad/archive/2006/03/14/551451.aspx</link><pubDate>Tue, 14 Mar 2006 22:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:551451</guid><dc:creator>Monad Team</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/monad/comments/551451.aspx</comments><wfw:commentRss>http://blogs.msdn.com/monad/commentrss.aspx?PostID=551451</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;In this blog I will try to explain different features of sort-object(Sort) cmdlet. For the purpose of this blog, I assume the following objects exist:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $a,$b,$c,$d&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Score Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;----- ----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100 John&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Henry&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Tom&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80 David&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;From the definition Sort looks like:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; (get-command sort-object).Definition&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;sort-object [[-Property] Object[]] [-Descending] [-Unique] [-InputObject MshObj&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;ect] [-Culture String] [-CaseSensitive] [-Verbose] [-Debug] [-ErrorAction Actio&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;nPreference] [-ErrorVariable String] [-OutVariable String] [-OutBuffer Int32]&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;The basic usage looks like:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&amp;lt;expression&amp;gt; | sort &amp;lt;property&amp;gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Sort works on a collection of input objects possibly coming over from a pipeline.&lt;/SPAN&gt; Sort will collect all the input objects from the pipeline and then sorts the objects based on other parameters like Property, Descending, Unique etc. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Example: To sort objects based on Score&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $a,$b,$c,$d | sort score&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Score Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;----- ----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;80 David&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Tom&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Henry&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100 John&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Example: To sort objects based on Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $a,$b,$c,$d | sort Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;Score Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;----- ----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80 David&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Henry&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100 John&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Tom&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Example: To sort objects in descending order based on Score&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $a,$b,$c,$d | sort Score -Descending&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Score Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;----- ----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100 John&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Tom&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Henry&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80 David&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Ok, this is all simple and you might yourself have already explored all this. Let us get into some tricky stuff. How to sort on Score (descending order) and Name (ascending order)&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Example: sort on Score descending and then Name ascending &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $a,$b,$c,$d | sort @{expression="Score";Descending=$true},@{e&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;xpression="Name";Ascending=$true}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;Score Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;----- ----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100 John&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Henry&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Tom&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80 David&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Notice the use of @{expression=…}. If you notice the definition of sort-object, the parameter Property takes in a object[].&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Property parameter can take entries of form &amp;lt;string&amp;gt; or hashtable (notice @). If the input is a hashtable, then Sort cmdlet specifically looks for “expression”,”ascending”,”descending” keys. Ascending and Descending can take only Booleans ( i.e., $true or $false ). Using expression you can do many things.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;For example, lets say Henry is very punctual and very dedicated and you wanted to give some additional marks (lets say 2 marks) to encourage him.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Example:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $a,$b,$c,$d | sort @{expression={if ($_.Name -eq "Henry") { $&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;_.Score += 2 }}},Score -Descending&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Score Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;----- ----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100 John&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;92 Henry&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Tom&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80 David&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Notice the use of Script for expression. In the above example, I changed the original object itself by using $_ and then sorted on Score&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $b&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Score Name&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;----- ----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;92 Henry&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Using Script block you can do many things like computing Grades and then sorting on Grade.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $a,$b,$c,$d | sort Grade,@{expression={if ($_.Score -gt 91) {&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;$Grade="A" } else {$Grade="B" }; add-member noteproperty "Grade" $Grade -InputOb&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;ject $_}} -Descending&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Score Name&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Grade&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;----- ----&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;-----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90 Tom&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;B&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80 David&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;B&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;100 John&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;A&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;92 Henry&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;A&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Sort in its simplest form is very useful. Using expressions effectively makes it more powerful.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;One last thing, a number of you has asked how to sort a hashtable using Sort-Object cmdlet.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $hash=@{"Tom"=90;"Henry"=90;"David"=80;"John"=100}&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $hash | sort value -descending&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Name&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Value&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;----&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;-----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Henry&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;90&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Tom&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;David&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;John&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;This will not work as there is only one object on the pipeline and sort-object does not have anything to sort. However use GetEnumerator() on HashTable to write all the hash entries to the pipeline and then use sort.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;MSH C:\temp\monad&amp;gt; $hash.GetEnumerator() | sort value -descending&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Name&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Value&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;----&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;-----&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;John&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;100&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Tom&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Henry&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;90&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;David&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;80&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;-Krishna[MSFT]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=551451" width="1" height="1"&gt;</description></item></channel></rss>