<?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 'Folder' and 'Size'</title><link>http://powershell.com/cs/search/SearchResults.aspx?q=app:weblogs&amp;tag=Folder,Size&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tags 'Folder' and 'Size'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Cleaning Hard Drives and Finding Folders Total Size</title><link>http://powershell.com/cs/blogs/tobias/archive/2008/11/25/cleaning-hard-drives-and-finding-folders-total-size.aspx</link><pubDate>Tue, 25 Nov 2008 06:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:402</guid><dc:creator>Tobias Weltner</dc:creator><description>
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;Hard drives these days are huge, and still they run out of space all too soon. So maybe you&amp;#39;d like to find out where the storage hogs are located and which folder wastes the most space. &lt;/p&gt;
&lt;p&gt;Or, you need to manage user profiles and would like to find out just how much space each consumes. Here is how.&lt;/p&gt;
&lt;h3&gt;Calculating a Folders&amp;#39; Total Size&lt;/h3&gt;
&lt;p&gt;Surprisingly, this isn&amp;#39;t as straightforward as it seems. There is no &amp;quot;size&amp;quot; property on folders. You have to calculate the total size step by step.&lt;/p&gt;
&lt;p&gt;To calculate a folders&amp;#39; total size, you need to enumerate all files contained in a folder and manually sum up their sizes. As it turns out, listing all files in a folder isn&amp;#39;t that hard:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Actually, &lt;strong&gt;Dir&lt;/strong&gt; (an alias pointing to &lt;strong&gt;Get-Childitem&lt;/strong&gt;) returns all files and folders in a folder. You can safely ignore folders because they have no length property. By specifying the &lt;strong&gt;-recurse&lt;/strong&gt; switch parameter, you get all files including those contained in subfolders. Now, you just need to sum the &lt;strong&gt;length&lt;/strong&gt; property of all those files. &lt;strong&gt;Measure-Object&lt;/strong&gt; can do that for you:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; | &lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The result is an object returned by &lt;strong&gt;Measure-Object&lt;/strong&gt; which includes the count of files as well as the sum of their lengths. To just get back the sum, access the property you are after:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;(dir &lt;span class="var"&gt;$home&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; | &lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt;).&lt;span class="method"&gt;Sum&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;#39;d like to get that information in another unit like MB or GB, you can now easily calculate with the information. Use the &lt;strong&gt;-f&lt;/strong&gt; operator to format numbers. The next example returns the total size in GB rounded to two digits after the decimal:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="string"&gt;&amp;#39;{0:0.00}&amp;#39;&lt;/span&gt; &lt;span class="op"&gt;-f&lt;/span&gt; ((dir &lt;span class="var"&gt;$home&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; | &lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt;).&lt;span class="method"&gt;Sum&lt;/span&gt;&lt;span class="op"&gt;/&lt;/span&gt;1GB)&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Calculating Total Size of Subfolders&lt;/h3&gt;
&lt;p&gt;Maybe you don&amp;#39;t want to get the total size of your &lt;strong&gt;$home&lt;/strong&gt; folder but instead a list of all subfolders in &lt;strong&gt;$home&lt;/strong&gt; with their aggregated size. To get that information, you first need a list of all subfolders in &lt;strong&gt;$home&lt;/strong&gt;. &lt;strong&gt;Dir&lt;/strong&gt; will get you both files and folders. To limit the output to folders only, filter the resulting objects. You could for example include only those that have a &lt;strong&gt;PSisContainer&lt;/strong&gt; property of &lt;strong&gt;$true&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Next, pipe each folder into a &lt;strong&gt;Foreach-Object&lt;/strong&gt; loop and calculate its total size like you did in the first example:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { Dir &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You now get back the results from &lt;strong&gt;Measure-Object&lt;/strong&gt; for each subfolder contained in &lt;strong&gt;$home&lt;/strong&gt;. However, you no longer see the folder names. The line only outputs the result from &lt;strong&gt;Measure-Object&lt;/strong&gt; which only tells you the file count and total size. To get a list of folder paths and total size, you can construct your very own return object and assign it the properties you are after.&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span style="background-color:#ffff00;"&gt;&lt;span class="var"&gt;$result&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;&amp;#39;&lt;/span&gt; | &lt;span class="verbnoun"&gt;Select-Object&lt;/span&gt; Path, Count, Size&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;path&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;; &lt;span class="var"&gt;$temp&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; Dir &lt;span class="var"&gt;$_.FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;count&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Count&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;Size&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Sum&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;$result = &amp;#39;&amp;#39; | Select-Object Path, Count, Size&lt;/em&gt; actually takes an empty string (two single quotes) and then uses &lt;strong&gt;Select-Object&lt;/strong&gt; to add custom properties: &lt;strong&gt;Path&lt;/strong&gt;, &lt;strong&gt;Count&lt;/strong&gt; and &lt;strong&gt;Size&lt;/strong&gt;. Next, the pipeline can store the information you need in these custom properties. At the end, it returns your custom object &lt;strong&gt;$result&lt;/strong&gt; to output the data in a structured way.&lt;/p&gt;
&lt;p&gt;The result now looks much better: you get back three columns: Path, Count and Size. Cool.&lt;/p&gt;
&lt;p&gt;However, you may also get some red error messages. They occur when a folder is empty or when you have no access rights. To skip error messages, set the &lt;strong&gt;ErrorAction&lt;/strong&gt; to &lt;strong&gt;&amp;quot;SilentlyContinue&amp;quot;&lt;/strong&gt;. This command will no longer throw exceptions on empty folders:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="var"&gt;$result&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;&amp;#39;&lt;/span&gt; | &lt;span class="verbnoun"&gt;Select-Object&lt;/span&gt; Path, Count, Size; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;path&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;; &lt;span class="var"&gt;$temp&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; Dir &lt;span class="var"&gt;$_.FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt; &lt;span style="background-color:#ffff00;"&gt;&lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue&lt;/span&gt; ; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;count&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Count&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;Size&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Sum&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And this command will skip over error messages generated because of unsufficient access rights for subfolders:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="var"&gt;$result&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;&amp;#39;&lt;/span&gt; | &lt;span class="verbnoun"&gt;Select-Object&lt;/span&gt; Path, Count, Size; &lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;path&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$temp&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; Dir &lt;span class="var"&gt;$_.FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; &lt;span style="background-color:#ffff00;"&gt;&lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue ; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;count&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Count&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;Size&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Sum&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Adding Progress Indicators&lt;/h3&gt;
&lt;p&gt;Since calculating sizes for large folders can take considerable time, it would be nice to present some sort of status messages to the user. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Write-Progress&lt;/strong&gt; can display a temporary status bar. You can add progress indicators by adding a &lt;strong&gt;Foreach-Object&lt;/strong&gt; into your pipeline. Inside of it, display whatever status message you want for the current object travelling the pipeline. Just make sure you output the object (&lt;strong&gt;$_&lt;/strong&gt;) at the end so following commands in the pipeline can pick it up and continue processing it:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } &lt;span style="background-color:#ffff00;"&gt;| &lt;br /&gt;&lt;/span&gt;&lt;span style="background-color:#ffff00;"&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="verbnoun"&gt;Write-Progress&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;Examining Folder&amp;#39;&lt;/span&gt; (&lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;); &lt;span class="var"&gt;$_&lt;/span&gt; }&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="var"&gt;$result&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;&amp;#39;&lt;/span&gt; | &lt;span class="verbnoun"&gt;Select-Object&lt;/span&gt; Path, Count, Size; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;path&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$temp&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; Dir &lt;span class="var"&gt;$_.FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue ; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;count&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Count&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;Size&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Sum&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Changing Units to MB&lt;/h3&gt;
&lt;p&gt;Up till now, your custom object returns the total bytes for each folder as a numeric value. To return the size in other units like &lt;strong&gt;MB&lt;/strong&gt;, you can again calculate. &lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="verbnoun"&gt;Write-Progress&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;Examining Folder&amp;#39;&lt;/span&gt; (&lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;); &lt;span class="var"&gt;$_&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="var"&gt;$result&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;&amp;#39;&lt;/span&gt; | &lt;span class="verbnoun"&gt;Select-Object&lt;/span&gt; Path, Count, SizeMB; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;path&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$temp&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; Dir &lt;span class="var"&gt;$_.FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue ; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;count&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Count&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;SizeMB&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span style="background-color:#ffff00;"&gt;[&lt;span class="datatype"&gt;Int&lt;/span&gt;](&lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Sum&lt;/span&gt;&lt;span class="op"&gt;/&lt;/span&gt;1MB)&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt; } &lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;#39;d like to stick to numbers, convert the result to &lt;strong&gt;Integer&lt;/strong&gt;. To get a specific number of digits after the decimal, you would have to specify size as &lt;strong&gt;String&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="verbnoun"&gt;Write-Progress&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;Examining Folder&amp;#39;&lt;/span&gt; (&lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;); &lt;span class="var"&gt;$_&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="var"&gt;$result&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;&amp;#39;&lt;/span&gt; | &lt;span class="verbnoun"&gt;Select-Object&lt;/span&gt; Path, Count, Size; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;path&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$temp&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; Dir &lt;span class="var"&gt;$_.FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue ; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;count&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Count&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;Size&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span style="background-color:#ffff00;"&gt;&lt;span class="string"&gt;&amp;#39;{0:0.00}&amp;#39;&lt;/span&gt; &lt;span class="op"&gt;-f&lt;/span&gt; (&lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Sum&lt;/span&gt;&lt;span class="op"&gt;/&lt;/span&gt;1MB)&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt; } &lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Sorting and Outputting&lt;/h3&gt;
&lt;p&gt;With your progress indicators in place, you can safely add additional cmdlets to sort or output the results. Without progress indicators, when you sort results or output them to a file or xml, you would not get any feedback until the entire operation has completed which for large folders can take a long time. Progress indicators are therefore a really good idea:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;dir &lt;span class="var"&gt;$home&lt;/span&gt; | &lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;PSisContainer&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="verbnoun"&gt;Write-Progress&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;Examining Folder&amp;#39;&lt;/span&gt; (&lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;); &lt;span class="var"&gt;$_&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; { &lt;span class="var"&gt;$result&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;&amp;#39;&lt;/span&gt; | &lt;span class="verbnoun"&gt;Select-Object&lt;/span&gt; Path, Count, Size; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;path&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;; &lt;br /&gt;&lt;span class="var"&gt;$temp&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; Dir &lt;span class="var"&gt;$_.FullName&lt;/span&gt; &lt;span class="modifier"&gt;-recurse&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue | &lt;br /&gt;&lt;span class="verbnoun"&gt;Measure-Object&lt;/span&gt; length &lt;span class="modifier"&gt;-sum&lt;/span&gt; &lt;span class="modifier"&gt;-ea&lt;/span&gt; SilentlyContinue ; &lt;br /&gt;&lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;count&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Count&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt;.&lt;span class="method"&gt;Size&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$temp&lt;/span&gt;.&lt;span class="method"&gt;Sum&lt;/span&gt;; &lt;span class="var"&gt;$result&lt;/span&gt; } &lt;span style="background-color:#ffff00;"&gt;| &lt;br /&gt;&lt;/span&gt;&lt;span style="background-color:#ffff00;"&gt;&lt;span class="verbnoun"&gt;Sort-Object&lt;/span&gt; Size &lt;span class="modifier"&gt;-descending&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Finding Special Folder Locations&lt;/h3&gt;
&lt;p&gt;Now that you can examine folder sizes, you may want to access special folders such as the user profile or a users&amp;#39; desktop folder. One great way of finding special folder paths is the .NET class &lt;strong&gt;System.Environment&lt;/strong&gt; with its static method &lt;strong&gt;GetFolderPath()&lt;/strong&gt;. For example, to find out the current Desktop folder, do this:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;[&lt;span class="namespace"&gt;System.Environment&lt;/span&gt;]::&lt;span class="method"&gt;GetFolderPath&lt;/span&gt;(&lt;span class="string"&gt;&amp;#39;Desktop&amp;#39;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that in &lt;a target="_blank" href="http://www.powershellplus.com"&gt;PowerShellPlus&lt;/a&gt;, you can place the cursor over &amp;#39;Desktop&amp;#39; and press TAB (press &lt;strong&gt;SHIFT+TAB&lt;/strong&gt; in the editor) to get a list of all available options. As it turns out, there are a lot of them. This call gets you your folder with all your personal documents:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;[&lt;span class="namespace"&gt;System.Environment&lt;/span&gt;]::&lt;span class="method"&gt;GetFolderPath&lt;/span&gt;(&lt;span class="string"&gt;&amp;#39;MyDocuments&amp;#39;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Calculating Folder Content with Turboboost&lt;/h3&gt;
&lt;p&gt;Admittedly, the way PowerShell sums up folder content is a little time-consuming because PowerShell needs to visit each single file. There are faster ways to do this, and you could use .NET methods or DLLs via COM. One such solution uses the &lt;strong&gt;Scripting.FileSystemObject&lt;/strong&gt; which can calculate the total size of a folder really fast:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;(&lt;span class="verbnoun"&gt;New-Object&lt;/span&gt; &lt;span class="modifier"&gt;-COMObject&lt;/span&gt; &lt;span class="namespace"&gt;Scripting.FileSystemObject&lt;/span&gt;).&lt;span class="method"&gt;GetFolder&lt;/span&gt;(&lt;span class="var"&gt;$home&lt;/span&gt;).&lt;span class="method"&gt;Size&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;However, this call may fail miserably and not return anything. It fails when you have no sufficient access privileges. Just one file inside of the folder structure with insufficient access privileges is enough to break this call. And: while external libraries calculate total folder size, there is no way for PowerShell to interrupt this operation. Even &lt;strong&gt;CTRL+C&lt;/strong&gt; won&amp;#39;t stop. PowerShell is single-threaded, and once it handed over control to some external DLL, it simply has to wait until that DLL finishes whatever it does.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s why the PowerShell approach has a lot of important advantages that make up for the slower performance. It is fault-tolerant and gracefully ignores files you cannot access, and you can cancel the call anytime.&lt;/p&gt;
&lt;p&gt;Have a great weekend!&lt;/p&gt;
&lt;p&gt;-Tobias&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item></channel></rss>