Solved

Folder sizes using Powershell

Posted on 2014-11-18
10
262 Views
Last Modified: 2014-11-27
Hi
 I am trying to get folder sizes of shared  folders that are located on network drives. However when l use the Powershell script attached. I only get the first  3 folder sizes within each shared folder that l run the script on. I would like  the script to include all the folders in the shared  folder. I would appreciate your assistance.
$a = Get-Date
$Year = $a.Year
$Month = $a.Month
$Day = $a.Day
$report = "c:\Scripts\Folder Size $Year$Month$Day.txt"

"Date: " + $a.ToShortDateString()  | Out-File -FilePath $report
"Time: " + $a.ToShortTimeString()  | Out-File -Append -FilePath $report


Out-File -Append -FilePath $report -InputObject "----------------------------------------------------------------" 
Out-File -Append -FilePath $report -InputObject "---                 Start of Script                          ---" 
Out-File -Append -FilePath $report -InputObject "----------------------------------------------------------------" 

Function RootScan
  {
  #List all root folders in the drive
  $folders = Get-ChildItem -Path $mainfolder | ? { $_.psiscontainer -and $_.FullName -notmatch $exclude}
  #$folders = Get-ChildItem -Path $mainfolder -exclude $exclude | ? { $_.psiscontainer -and $_.FullName}
  Out-File -Append -FilePath $report -InputObject "Start Root"
  ForEach ($folder in $folders)
  {
    $subFolderItems = (Get-ChildItem $folder.FullName -Recurse | Measure-Object -property length -sum)
    $folder.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB" | Out-File -Append -FilePath $report
  }
Out-File -Append -FilePath $report -InputObject "Finished Root"
}

Function SubScan
{
#List all Group folders in the GroupDrive
ForEach ($folderGroup in $Group)
{
  #Write-Host "This is FolderGroup: $folderGroup"
  $foldersGroup = Get-ChildItem -Path $foldergroup | ? { $_.psiscontainer -and $_.FullName}
  $SubNum = $SubNum + 1
  Out-File -Append -FilePath $report -InputObject "Start $SubNum"

    ForEach ($child in $foldersGroup)
    {
    #Write-Host "This is FoldersGroup: $child"
    $subFolderItems = (Get-ChildItem $child.FullName -Recurse | Measure-Object -property length -sum)
    $Child.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB" | Out-File -Append -FilePath $report
    }
  
  Out-File -Append -FilePath $report -InputObject "Finished $SubNum"
}}

$mainfolder = "M:\small"
$SubNum = 2
#Enter Directories Requiring Individual Subfolder Count
#$Group = "C:\Temp\"
#Enter Directories Excluded from Root Count
$exclude = "Users Data", "Test"
RootScan
#SubScan

#$mainfolder = "c:\Temp"
#$SubNum = 1
#Enter Directories Requiring Individual Subfolder Count
#$Group = "c:\Temp"
#Enter Directories Excluded from Root Count
#$exclude = "1"
#RootScan
#SubScan

Out-File -Append -FilePath $report -InputObject  "----------------------------------------------------------------"
Out-File -Append -FilePath $report -InputObject  "---                 End of Script                            ---"
Out-File -Append -FilePath $report -InputObject  "----------------------------------------------------------------"

$a = Get-Date
"Date: " + $a.ToShortDateString()  | Out-File -Append -FilePath $report
"Time: " + $a.ToShortTimeString()  | Out-File -Append -FilePath $report

#Get-ChildItem | Get-Member -MemberType Property

Open in new window

0
Comment
Question by:Go-micro
  • 5
  • 4
10 Comments
 
LVL 68

Accepted Solution

by:
Qlemo earned 500 total points
ID: 40450430
The script is working fine. Maybe there are some permission issues stopping the script from further processing each root folder?
0
 

Author Comment

by:Go-micro
ID: 40452078
All the permissons are similar on all the drives  and folders but the result is the same when l run the script on any of them l can only get the results for the first 3 folders. So doubt that can be the issue, however the drives are SAN drives  mapped to the server via ICSI and the permisson are inherited from the root folder
0
 
LVL 68

Assisted Solution

by:Qlemo
Qlemo earned 500 total points
ID: 40452253
Try the script first with a local folder having more than three subfolders. I've done local and remote and it always returned more than 3 subfolders.
0
 

Author Comment

by:Go-micro
ID: 40452311
Hi Qlemo
 You could be right, I  have seen the results of one of the drives on the server  and it has listed all the folders for the root folder so that  means the sctipt is working, so l will re-examine the permissons on the drives that have failed.
0
Are your corporate email signatures appalling?

Is it scary how unprofessional your email signatures look? Do users create their own terrible designs and give themselves stupid job titles? You can make this a lot easier for yourself by choosing an email signature management solution from Exclaimer today.

 

Author Comment

by:Go-micro
ID: 40461854
Hi Qlemo
I have changed the permissions and it has worked, thanks. However l have a new question, l can understand if it is not possible to answer it and l will be happy to close the question. Is it possible to have the script run and scan 3 folders are the same time or am l asking for too much?
0
 
LVL 68

Assisted Solution

by:Qlemo
Qlemo earned 500 total points
ID: 40462705
That would be some work, because that script is not written in a way easy to change to other requirements. E.g. the logging is done both outside and inside of the function, it uses global vars instead of parameters etc. pp.
I've removed anything unnecessary, and improved the function call so you can use it multiple times:
$report = "c:\Temp\EE\Folder Size $(get-date -format "yyyyMMdd").txt"

@"
----------------------------------------------------------------
---     Start of Script: $(get-date)
----------------------------------------------------------------

"@ | Out-File -Append -FilePath $report

Function global:RootScan($mainfolder, $exclude)
{
  #List all root folders in the drive
  $folders = Get-ChildItem -Path $mainfolder | ? { $_.psiscontainer -and $_.FullName -notmatch $exclude}
  Write-Output "-- Start Root of $mainfolder"
  ForEach ($folder in $folders)
  {
    $subFolderItems = (Get-ChildItem $folder.FullName -Recurse | Measure-Object -property length -sum).Sum
    Write-Output ($folder.FullName + " -- " + "{0:N2}" -f ($subFolderItems / 1MB) + " MB")
  }
  Write-Output "-- Finished Root of $mainfolder"
}

Start-Job -ScriptBlock (get-command RootScan).ScriptBlock -ArgumentList "M:\Small"       , @("Users Data", "Test") | Out-Null
Start-Job -ScriptBlock (get-command RootScan).ScriptBlock -ArgumentList "N:\Even Smaller", @("User Profiles")      | Out-Null
# and so on

while ($job = Get-Job | Wait-Job -Any)
{
  Receive-Job $job | Out-File -Append $report
  Remove-Job $job
}

@"
----------------------------------------------------------------
---                 End of Script: $(get-date)
----------------------------------------------------------------
"@ | Out-File -Append $report

Open in new window

0
 
LVL 68

Expert Comment

by:Qlemo
ID: 40462708
Though, it would be much better to generate objects instead of strings, and export as CSV ...
0
 

Author Comment

by:Go-micro
ID: 40468757
Great thank for your help Qlemo much appreciated!
0
 

Author Closing Comment

by:Go-micro
ID: 40468765
The expert was able to provide an additional solution that was not part of the original question, great guy!
0

Featured Post

Don't lose your head updating email signatures!

Do your end users still have the wrong email signature? Do email signature updates bore you or fill you with a sense of dread? You can make this a whole lot easier on yourself by trusting an Exclaimer email signature management solution. Over 50 million users do...so should you!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Citrix XenApp, Internet Explorer 11 set to Enterprise Mode and using central hosted sites.xml file.
Storage devices are generally used to save the data or sometime transfer the data from one computer system to another system. However, sometimes user accidentally erased their important data from the Storage devices. Users have to know how data reco…
Windows 8 comes with a dramatically different user interface known as Metro. Notably missing from the new interface is a Start button and Start Menu. Many users do not like it, much preferring the interface of earlier versions — Windows 7, Windows X…
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now