<?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 'Export-Clixml', '-eq', 'Get-Service', and 'Integer'</title><link>http://powershell.com/cs/search/SearchResults.aspx?q=app:weblogs&amp;tag=Export-Clixml,-eq,Get-Service,Integer&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tags 'Export-Clixml', '-eq', 'Get-Service', and 'Integer'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>1 equals &amp;quot;Running&amp;quot;? - Melting Integer and String Objects together</title><link>http://powershell.com/cs/blogs/tobias/archive/2010/01/07/1-equals-quot-running-quot-melting-integer-and-string-objects-together.aspx</link><pubDate>Thu, 07 Jan 2010 06:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:4404</guid><dc:creator>Tobias</dc:creator><description>&lt;p&gt;By coincidence, I stumbled upon &lt;a target="_blank" href="http://blogs.msdn.com/powershell/archive/2007/01/09/two-plus-two-equals-monday.aspx"&gt;an article in the PS team blog&lt;/a&gt; which talks about comparing different object types. It definitely is worth looking at, but let&amp;#39;s take it a step further.&lt;/p&gt;
&lt;p&gt;Recently, while I was deserializing service objects, I found that &amp;quot;status&amp;quot; was&amp;nbsp;returned as friendly text such as &amp;quot;Running&amp;quot; or &amp;quot;Stopped&amp;quot; &lt;em&gt;BUT&lt;/em&gt; when I took a deeper look, it turned out this property returned &lt;strong&gt;Int32&lt;/strong&gt;, numeric values. &lt;/p&gt;
&lt;p&gt;So naturally, two questions arose: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first, how mad can it get when &lt;strong&gt;Int32&lt;/strong&gt; suddenly starts outputting text?&lt;/li&gt;
&lt;li&gt;and second, why did I take a deeper look at this in the first place? (aka, what is the real world relevance?)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;WYSI&lt;span style="text-decoration:underline;"&gt;NA&lt;/span&gt;WYG - What you see is NOT ALWAYS what you get&lt;/h2&gt;
&lt;p&gt;Usually, when you output objects to the console, you can safely look at the columns, pick some values and use them for future filtering on those properties, just&amp;nbsp;like this:&lt;/p&gt;
&lt;p&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Service&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;/p&gt;
&lt;p&gt;With deserialized service objects, this suddenly fails which was when I started to scratch my head:&lt;/p&gt;
&lt;p&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Service&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Export-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$services&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Import-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;/p&gt;
&lt;p&gt;The last line simply does not&amp;nbsp;return anything although there definitely are running service objects. Crazy.&lt;/p&gt;
&lt;p&gt;Guess why? With deserialized service objects, &lt;strong&gt;Status&lt;/strong&gt; returns text &lt;em&gt;that really is numeric&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;$services&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Foreach-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;Status.GetType&lt;/span&gt;&lt;/span&gt;().&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;FullName&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span style="color:#8b4513;"&gt;&lt;span class="namespace"&gt;System.Int32&lt;/span&gt;&lt;br /&gt;&lt;span class="namespace"&gt;System.Int32&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;(...)&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So, you would have to compare against the &lt;em&gt;numeric&lt;/em&gt; value, not the &lt;em&gt;text&lt;/em&gt; that was displayed in the &lt;strong&gt;Status&lt;/strong&gt; column inside the console:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$services&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; 4 }&lt;/p&gt;
&lt;p&gt;Uh, that is strange... Do I have your attention now?&lt;/p&gt;
&lt;h2&gt;Override toString() to get Int32-Mutations...&lt;/h2&gt;
&lt;p&gt;To make an integer appear as something different, all you need to do is override its &lt;strong&gt;toString()&lt;/strong&gt; method. Replace it with whatever you would like to use to display the variable. Here is a sample:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; 1&lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$b&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;1&lt;/p&gt;
&lt;p&gt;I stored a numeric value in a variable called &lt;strong&gt;$b&lt;/strong&gt;, and naturally, when I output it, it shows what it is: a numeric value. No surprises. But wait!&lt;/p&gt;
&lt;p&gt;Next, I override its &lt;strong&gt;toString()&lt;/strong&gt; method with my own ScriptMethod:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Add-Member&lt;/span&gt;&lt;/span&gt; scriptMethod &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-pass&lt;/span&gt;&lt;/span&gt; toString &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-force&lt;/span&gt;&lt;/span&gt; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Running&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$b&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Running&lt;/p&gt;
&lt;p&gt;Tada! Now, when I output &lt;strong&gt;$b&lt;/strong&gt;, it changes nature and returns whatever I specified in my &lt;strong&gt;toString()&lt;/strong&gt; method. So my &lt;strong&gt;Int32&lt;/strong&gt; now looks like a string.&lt;/p&gt;
&lt;p&gt;&amp;quot;Oh yeah&amp;quot;, you may mumble, &amp;quot;so smarty, why did you not use a string in the first place?&amp;quot; Well, because although &lt;strong&gt;$b&lt;/strong&gt; looks like a string, it is still an Integer:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; 1&lt;br /&gt;True&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;False&lt;/p&gt;
&lt;p&gt;In fact, &lt;strong&gt;$b&lt;/strong&gt; now behaves exactly like the deserialized &lt;strong&gt;Status&lt;/strong&gt; property I received back from my initial service objects. With hybrid Integers, you output information as nice &amp;amp; friendly text so you don&amp;#39;t have to look up geeky values to understand what them numbers stand for. Still, you can efficiently compare them against numeric values if you need to.&lt;/p&gt;
&lt;h2&gt;-like to the Rescue&lt;/h2&gt;
&lt;p&gt;The only problem with this is that you run into problems like I did if you don&amp;#39;t know about this masquerade. You *think* it is text but once you compare it with text, the comparison mumbles &amp;quot;nope, it&amp;#39;s an integer, so I return $false&amp;quot; - well it does not even mumble&amp;nbsp;this but silently leaves you puzzling.&lt;/p&gt;
&lt;p&gt;A somewhat useful workaround for these cases is &lt;strong&gt;-like&lt;/strong&gt; which compares the value of a variable based on its toString() result as Jason pointed out (thanks for correcting me). Have a look:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-like&lt;/span&gt;&lt;/span&gt; 1&lt;br /&gt;False&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-like&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;True&lt;/div&gt;
&lt;p&gt;So this conclusion helped solve my initial problem. By replacing &lt;strong&gt;-eq&lt;/strong&gt; with &lt;strong&gt;-like&lt;/strong&gt;, all worked fine:&lt;/p&gt;
&lt;p&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Service&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Export-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$services&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Import-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-like&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;/p&gt;
&lt;p&gt;Have a great 2010 and keep tuned, &lt;br /&gt;hey and go ahead and &lt;a target="_blank" href="http://www.idera.com/Products/PowerShell/PowerShell-Plus/"&gt;try our PowerShellPlus smart PS console&lt;/a&gt; if you are at it, Richard and I would appreciate it! &lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;P.S.&lt;/p&gt;
&lt;p&gt;Richard just commented on my post: &amp;quot;VERY geeky, but nice!&amp;quot; So let&amp;#39;s boil it down to one sentence: &amp;quot;If -&lt;strong&gt;eq&lt;/strong&gt; does not seem to work, try &lt;strong&gt;-lik&lt;/strong&gt;e instead.&amp;quot;&lt;/p&gt;</description></item></channel></rss>