<?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 'Array', '-join', and 'Out-String'</title><link>http://powershell.com/cs/search/SearchResults.aspx?q=app:weblogs&amp;tag=Array,-join,Out-String&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tags 'Array', '-join', and 'Out-String'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Displaying Data in Excel (and why it won't work)</title><link>http://powershell.com/cs/blogs/tobias/archive/2012/04/24/displaying-data-in-excel-and-why-it-won-t-work.aspx</link><pubDate>Tue, 24 Apr 2012 05:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:16128</guid><dc:creator>Tobias</dc:creator><description>&lt;p&gt;It&amp;#39;s pretty easy to &lt;strong&gt;send&lt;/strong&gt; PowerShell &lt;strong&gt;results to Excel&lt;/strong&gt; and display them nicely as a spreadsheet. Actually, here&amp;#39;s a simple function called &lt;strong&gt;Out-ExcelReport&lt;/strong&gt;. Pipe anything to it, and it shows up as an excel sheet (provided you have indeed installed excel beforehand):&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-ExcelReport&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;param&lt;/span&gt;&lt;/span&gt;(&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&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="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;$env:temp\report$(Get-Date -format yyyyMMddHHmmss).csv&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;[&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt;&lt;/span&gt;]&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$open&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;)&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$Input&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Export-Csv&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-NoTypeInformation&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-UseCulture&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Encoding&lt;/span&gt;&lt;/span&gt; UTF8&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$open&lt;/span&gt;&lt;/span&gt;) { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Invoke-Item&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;Now creating spreadsheets&amp;nbsp;is as easy as this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Process&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-ExcelReport&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-open&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;Why Does Excel Display Garbage?&lt;/h3&gt;
&lt;p&gt;Displaying results in Excel isn&amp;#39;t so much a problem once you figure out how to export to CSV and then import that to excel. &lt;/p&gt;
&lt;p&gt;The problem becomes evident a bit later, when you &lt;strong&gt;start to have fun&lt;/strong&gt; and then suddenly &lt;strong&gt;run into lines&lt;/strong&gt; such as this one:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-WMIObject&lt;/span&gt;&lt;/span&gt; Win32_NetworkAdapterConfiguration &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;filter&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;IPEnabled=True&amp;#39;&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; Caption, DefaultIPGateway, MACAddress, IPAddress | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-ExcelReport&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-open&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;This line will indeed&amp;nbsp;find your active network adapters, and it will open excel and display the network properties your code selected. But... the result probably looks similar to this:&lt;/p&gt;
&lt;div class="pscode"&gt;Caption DefaultIPGateway MACAddress IPAddress&lt;br /&gt;[00000007] Bro... System.&lt;span class="datatype"&gt;&lt;span style="color:#0000ff;"&gt;String&lt;/span&gt;&lt;/span&gt;[] 68:A8:6D:0B:5F:CC System.&lt;span class="datatype"&gt;&lt;span style="color:#0000ff;"&gt;String&lt;/span&gt;&lt;/span&gt;[]&lt;/div&gt;
&lt;p&gt;Note how some properties display correctly (such as &lt;strong&gt;MACAddress&lt;/strong&gt;), while others read &amp;quot;&lt;strong&gt;System.String[]&lt;/strong&gt;&amp;quot;. Where did the IP address go?&lt;/p&gt;
&lt;h3&gt;Shape Up Your Results!&lt;/h3&gt;
&lt;p&gt;The problem occurs whenever the property is &lt;strong&gt;NOT just text&lt;/strong&gt;. Since excel can only deal with text, anything that is not text in the first place &lt;strong&gt;needs to be converted to text&lt;/strong&gt;. &lt;strong&gt;&amp;quot;System.String[]&amp;quot; &lt;/strong&gt;simply is the result of such a conversion. The property you tried to display was an array of strings. That&amp;#39;s correct BTW. A network adapter can have multiple IP addresses, so the property &lt;strong&gt;IPAddress&lt;/strong&gt; is by design an array.&lt;/p&gt;
&lt;p&gt;To &lt;strong&gt;create meaningful reports&lt;/strong&gt;, you need to convert such properties to text in a &lt;strong&gt;more clever way&lt;/strong&gt;. Here are two things you can do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Join Arrays:&lt;/strong&gt; use the &lt;strong&gt;-join operator&lt;/strong&gt; to join array elements and produce descriptive text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Out-String:&lt;/strong&gt; send the property to &lt;strong&gt;Out-String&lt;/strong&gt; and take advantage of PowerShell&amp;#39;s own &lt;strong&gt;built-in conversion support&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So how exactly would you implement these conversion methods? Well, here&amp;#39;s a way:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$results&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;Get-WMIObject&lt;/span&gt;&lt;/span&gt; Win32_NetworkAdapterConfiguration &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;filter&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;IPEnabled=True&amp;#39;&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; Caption, DefaultIPGateway, MACAddress, IPAddress &lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$results&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;DefaultIPGateway&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;$results&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;DefaultIPGateway&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-join&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$results&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;IPAddress&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;$results&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;IPAddress&lt;/span&gt;&lt;/span&gt; | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Out-String&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$results&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-ExcelReport&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-open&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Note how I just took the result produced by &lt;strong&gt;Select-Object&lt;/strong&gt; and saved that in $results. That&amp;#39;s all. Since &lt;strong&gt;Select-Object&lt;/strong&gt; always creates new objects with only the properties I want, and since objects produced by &lt;strong&gt;Select-Object&lt;/strong&gt; are always &lt;strong&gt;read/write&lt;/strong&gt;, I now can use whatever method I prefer to beautify those properties. Then, when all is fine, I can continue and send $results on to &lt;strong&gt;Out-ExcelReport&lt;/strong&gt;. The result is a report with all the multivalues displaying fine. &lt;/p&gt;
&lt;p&gt;Phew! Done - and you now can convert your PowerShell results to excel reports - and fine-tune any property that isn&amp;#39;t showing up the way you want it to. Stay tuned...!&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Microsoft MVP PowerShell Germany&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;P.S.&lt;br /&gt;If you live in Germany or other parts of Europe and your company would like to set up a truly great PowerShell training, just contact me! I regularly train mid- to large-size companies. Trainings are always a blast with tons of real-world-examples and solutions. Here&amp;#39;s how to get in touch with me: &lt;a href="mailto:tobias.weltner@scriptinternals.de"&gt;&lt;span style="color:#3366cc;"&gt;tobias.weltner@scriptinternals.de&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;</description></item></channel></rss>