<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/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>Search results for 'app:weblogs' matching tags 'registry', 'COM', 'TypeName', and 'Split'</title><link>http://powershell.com/cs/search/SearchResults.aspx?q=app:weblogs&amp;tag=registry,COM,TypeName,Split&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tags 'registry', 'COM', 'TypeName', and 'Split'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Identifying Object Types</title><link>http://powershell.com/cs/blogs/tobias/archive/2008/10/14/identifying-object-types.aspx</link><pubDate>Tue, 14 Oct 2008 05:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:102</guid><dc:creator>Tobias Weltner</dc:creator><description>&lt;p&gt;In an object oriented world, commands return&amp;nbsp;all kinds of different objects. To really find what you are looking for, identifying object types is crucial. &lt;/p&gt;
&lt;h2&gt;&lt;span style="color:#3366ff;"&gt;Identifying .NET Objects&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Most often, you work with .NET objects since PowerShell is based on .NET. Cmdlets generally return .NET objects. Let&amp;#39;s take for example a simple &lt;strong&gt;Dir&lt;/strong&gt; (aka &lt;strong&gt;Get-Childitem&lt;/strong&gt;) to list the contents of your windows folder:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;$env:windir&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Windows&lt;br /&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;Name&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;----&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18.11.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16:53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;ADAM&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;02.11.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13:35&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;addins&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11.09.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;08:13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;AppPatch&lt;br /&gt;d-r-s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13.10.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20:04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;assembly&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;04.04.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;19:17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;Boot&lt;br /&gt;(...)&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;29.03.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13:11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;285488&amp;nbsp;BtwIEProxy.exe&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;06.12.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18:05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;478&amp;nbsp;CLNDR.CMD&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16.11.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16:36&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;762&amp;nbsp;comsetup.log&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15.01.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;01:04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;370&amp;nbsp;comsetup.log.zip&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;24.10.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20:19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&amp;nbsp;csup.txt&lt;br /&gt;(...)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;When you start working with PowerShell, you may &lt;em&gt;think &lt;/em&gt;Cmdlets return text when in fact all you see are objects. PowerShell simply &amp;quot;reduces&amp;quot; objects to text if you don&amp;#39;t do anything with them, so the text output you see&amp;nbsp;in the PowerShell console is just a simplified text representation of your objects. I am not&amp;nbsp;going to dive deeper into this conversion today.&lt;/p&gt;
&lt;p&gt;As you can see, though, &lt;strong&gt;Dir&lt;/strong&gt; obviously returned two completely different object types: files and folders. Why on&amp;nbsp;earth would you care? For example, because you might want to filter the output and show only subfolders or only files. To do that, you need to know what object type you are looking for.&lt;/p&gt;
&lt;p&gt;With .NET, finding out object types is easy. Every .NET object has a &lt;strong&gt;GetType()&lt;/strong&gt; method which returns the type information. Type information again is an object with a number&amp;nbsp;of properties. The property &lt;strong&gt;FullName&lt;/strong&gt; gets you the fully qualified type name of any .NET object. Check this out:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;$env:windir&amp;nbsp;|&amp;nbsp;%&amp;nbsp;{&amp;nbsp;$_.GetType().FullName&amp;nbsp;}&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;(...)&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;(...)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As you discover, files are represented by a &lt;strong&gt;System.IO.FileInfo&lt;/strong&gt; object whereas folders are wrapped up by a &lt;strong&gt;System.IO.DirectoryInfo&lt;/strong&gt; object. To filter the output of a Cmdlet by object type, all you do is use &lt;strong&gt;Where-Object&lt;/strong&gt; (short: &lt;strong&gt;?&lt;/strong&gt;) and make sure the condition is only met by the object you want. The following code lists only subfolders of a folder:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;$env:windir&amp;nbsp;|&amp;nbsp;?&amp;nbsp;{&amp;nbsp;$_&amp;nbsp;-is&amp;nbsp;[System.IO.DirectoryInfo]&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Windows&lt;br /&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;Name&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;----&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18.11.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16:53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;ADAM&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;02.11.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13:35&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;addins&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11.09.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;08:13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;AppPatch&lt;br /&gt;d-r-s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13.10.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20:04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;assembly&lt;br /&gt;(...)&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;02.11.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11:24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;SchCache&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Note that in PowerShell, types are always identified by square brackets. You can use types in conjunction with the &lt;strong&gt;-is&lt;/strong&gt; operator to check whether an object is a specific type. &lt;/p&gt;
&lt;p&gt;Why are there different types in the first place? Because types are specialized data containers, and each type is best at representing a specific set of information. For example, a &lt;strong&gt;String&lt;/strong&gt; type can store any text whereas a &lt;strong&gt;DateTime&lt;/strong&gt; type stores Dates and Times. &lt;/p&gt;
&lt;p&gt;Of course you could store a Date or Time in the generic String type but a &lt;strong&gt;DateTime&lt;/strong&gt; type can handle Dates and Times much better and display the Weekday, format&amp;nbsp; the date according to your locate and provide specific Date and Time methods to add or remove&amp;nbsp;time intervals.&lt;/p&gt;
&lt;p&gt;This is why you&amp;nbsp;can also use types to convert information into the type you want:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;(Get-Date).GetType().FullName&lt;br /&gt;System.DateTime&lt;br /&gt;PS&amp;gt;&amp;nbsp;&amp;quot;10/10/2008&amp;quot;&lt;br /&gt;10/10/2008&lt;br /&gt;PS&amp;gt;&amp;nbsp;[System.DateTime]&amp;quot;10/10/2008&amp;quot;&lt;br /&gt;&lt;br /&gt;Friday,&amp;nbsp;October 10,&amp;nbsp;2008&amp;nbsp;00:00:00&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;And you can use types to &amp;quot;strongly type&amp;quot; a variable and make sure it only accepts data that can be converted into the specified type:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # regular variables store any type, and PowerShell picks the type for you:&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; $date1&amp;nbsp;=&amp;nbsp;&amp;quot;10/10/2008&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # here, PowerShell has chosen the plain vanilla String type:&lt;br /&gt;PS&amp;gt;&amp;nbsp;$date1&lt;br /&gt;10/10/2008&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # chose a specific type by appending it to a variable:&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;[System.DateTime]$date2&amp;nbsp;=&amp;nbsp;$date1&lt;br /&gt;PS&amp;gt;&amp;nbsp;$date2&lt;br /&gt;&lt;br /&gt;Friday,&amp;nbsp;October 10,&amp;nbsp;2008&amp;nbsp;00:00:00&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # $date2 will only accept data that can be converted to the DateTime type:&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$date2&amp;nbsp;=&amp;nbsp;&amp;quot;This&amp;nbsp;is&amp;nbsp;no&amp;nbsp;valid&amp;nbsp;date.&amp;quot;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;Cannot&amp;nbsp;convert&amp;nbsp;value&amp;nbsp;&amp;quot;This&amp;nbsp;is&amp;nbsp;no&amp;nbsp;valid&amp;nbsp;date.&amp;quot;&amp;nbsp;to&amp;nbsp;type&amp;nbsp;&amp;quot;System.DateTime&amp;quot;.&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;Error:&amp;nbsp;&amp;quot;The&amp;nbsp;string&amp;nbsp;was&amp;nbsp;not&amp;nbsp;recognized&amp;nbsp;as&amp;nbsp;a&amp;nbsp;valid&amp;nbsp;DateTime.&amp;nbsp;There&amp;nbsp;is&amp;nbsp;a&amp;nbsp;unk&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;nown&amp;nbsp;word&amp;nbsp;starting&amp;nbsp;at&amp;nbsp;index&amp;nbsp;0.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;At&amp;nbsp;line:1&amp;nbsp;char:7&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;+&amp;nbsp;$date2&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp;=&amp;nbsp;&amp;quot;This&amp;nbsp;is&amp;nbsp;no&amp;nbsp;valid&amp;nbsp;date.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;&lt;span style="color:#3366ff;"&gt;Identifying&amp;nbsp;COM Objects&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;COM objects are a completely different ballgame. COM is the &amp;quot;old&amp;quot; technique used before .NET was invented, and COM objects have no common methods such as &lt;strong&gt;GetType()&lt;/strong&gt;. How do you find the type of a COM object?&lt;/p&gt;
&lt;p&gt;In VBScript, there was a function called &lt;strong&gt;TypeName()&lt;/strong&gt; which worked almost like GetType(). This function is not available in PowerShell, though. Since you cannot access &lt;strong&gt;TypeName()&lt;/strong&gt; or &lt;strong&gt;GetType()&lt;/strong&gt;, are you stuck? Fortunately not.&lt;/p&gt;
&lt;p&gt;Whenever you instantiate a COM object in PowerShell, PowerShell actually adds a .NET interface to it. The good thing is that PowerShell remembers where the COM object came from and adds the property &lt;strong&gt;pstypenames&lt;/strong&gt; to every object. Let&amp;#39;s check that out:&lt;/p&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;-comObject&amp;nbsp;WScript.Shell&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com.pstypenames&lt;br /&gt;System.__ComObject#&lt;span style="color:#ff0000;"&gt;{41904400-be18-11d3-a28b-00104bd35090}&lt;/span&gt;&lt;br /&gt;System.__ComObject&lt;br /&gt;System.MarshalByRefObject&lt;br /&gt;System.Object&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com.pstypenames[0]&lt;br /&gt;System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As it turns out, pstypenames is an array and gives you the conversion history, telling you the derivation of each object. In the example above, the COM object came from a COM Interface with a given GUID. The same works for .NET objects as well:&lt;/p&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;(Get-Date).pstypenames&lt;br /&gt;System.DateTime&lt;br /&gt;System.ValueType&lt;br /&gt;System.Object&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;Now, for COM objects a GUID is nice but does not tell you anything interesting about the interface. You are not getting the information you got from VBScript&amp;#39;s &lt;strong&gt;TypeName&lt;/strong&gt;. The GUID really is the identifier of a COM interface, and to find its name you can look it up in the registry:&lt;/p&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;-comObject&amp;nbsp;WScript.Shell&lt;br /&gt;PS&amp;gt;&amp;nbsp;$type&amp;nbsp;=&amp;nbsp;$com.pstypenames[0].Split(&amp;#39;#&amp;#39;)[1]&lt;br /&gt;PS&amp;gt;&amp;nbsp;(Get-ItemProperty&amp;nbsp;&amp;quot;HKLM:\SOFTWARE\Classes\Interface\$type&amp;quot;).&amp;#39;(default)&amp;#39;&lt;br /&gt;IWshShell3&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;The clear text interface name is &amp;quot;IWshShell3&amp;quot; which happens to be exactly the output you used to get from VBScript&amp;#39;s &lt;strong&gt;TypeName()&lt;/strong&gt; method. How did that work?&lt;/p&gt;
&lt;p&gt;PowerShell adds the Interface GUID to the COM type, separated by &amp;quot;#&amp;quot;, so you can use &lt;strong&gt;Split()&lt;/strong&gt; to use this as split mark and get back a string array. The GUID is located in the second element (index 1). This is stored in &lt;strong&gt;$type&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Next, &lt;strong&gt;Get-ItemProperty&lt;/strong&gt; looks up this GUID in your Windows Registry. Since Get-ItemProperty returns all kind of garbage and you are only interested in the (default) entry, only the result of Get-ItemProperty is taken. You then can query the Registry value you need. Since the key we are after contains special characters, it needs to be put in single quotes.&lt;/p&gt;
&lt;p&gt;Ok, I admit this was a deep dive at parts but I still hope you enjoyed this little tour.&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;</description></item></channel></rss>