Script to find out size of specific folders from a list of servers

Posted on 2013-01-08
Last Modified: 2013-01-16
We need to find the size of two folders from a list of file servers. The problem is they may me mounted on any of the volume on the servers. So no consistency as such.
Only thing that is consistent is the names of two folders.
Example- on all 100 file servers  we need to list size of A and B which are sub folders under shared drive  C  and C is on  a volume (volume name may be anything).

Powershell or VBscript anything can work for me.
Question by:sydneyithelpdesk
  • 2
  • 2

Author Comment

ID: 38758294
Making this bit easy - C is a shared folder and accessible from any computer so we can forget about which volume it resides on.
LVL 65

Expert Comment

ID: 38758406
Hi, give this script a shot.



strInputFile = "servers.txt"
strOutputFile = "foldersize.csv"
strFolderShare = "C$"
arrSubFolders = Array("Temp", "Users")

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objInput = objFSO.OpenTextFile(strInputFile, ForReading, True)
Set objOutput = objFSO.CreateTextFile(strOutputFile, True)
objOutput.WriteLine """Server"",""" & Join(arrSubFolders, """,""") & """"
While Not objInput.AtEndOfStream
	strComputer = Trim(objInput.ReadLine)
	If strComputer <> "" Then
		If Ping(strComputer) = True Then
			objOutput.Write """" & strComputer & """"
			For Each strSubFolder In arrSubFolders
				strFolderPath = "\\" & strComputer & "\" & strFolderShare & "\" & strSubFolder
				If objFSO.FolderExists(strFolderPath) = False Then
					objOutput.Write ",""<NOT FOUND>"""
					On Error Resume Next
					strSize = 0
					Set objFolder = Nothing
					Set objFolder = objFSO.GetFolder(strFolderPath)
					If Err.Number = 0 Then
						strSize = objFolder.Size/1024/1024
						If Err.Number = 0 Then
							objOutput.Write ",""" & strSize & """"
							objOutput.Write ",""" & Err.Number & ": " & Err.Description & """"
						End If
						objOutput.Write ",""" & Err.Number & ": " & Err.Description & """"
					End If
					On Error Goto 0
				End If
			objOutput.WriteLine """" & strComputer & """<OFFLINE>"",""<OFFLINE>"""
		End If
	End If

WScript.Echo "Done"

Function Ping(strComputer)
	Dim objShell, boolCode
	Set objShell = CreateObject("WScript.Shell")
	boolCode = objShell.Run("Ping -n 1 -w 300 " & strComputer, 0, True)
	If boolCode = 0 Then
		Ping = True
		Ping = False
	End If
End Function

Open in new window


Author Comment

ID: 38758506
Thanks Rob! I was already following one of your article

Here If i try to run this script Result says "Not found"

I changed third line to "Ndrive$" however as it is a shared folder on every server does this require $ with it.
LVL 40

Assisted Solution

Subsun earned 250 total points
ID: 38759090
If you are interested in PowerShell script..
C:\server.txt is the input file..
The script will search for directories subsun and PerfLogs in server's C:\ drive (Check line number 6 and 7 to change it)..
[Array]$Result = $null
GC C:\server.txt | % {
$Server = $_
If (Test-Connection $Server -Count 2 -ErrorAction SilentlyContinue) {
 If (Get-PSDrive z -ErrorAction SilentlyContinue) {Remove-PSDrive -Name z}
  If (New-PSDrive -Name z -PSProvider FileSystem -Root \\$Server\C$ -ErrorAction SilentlyContinue) { 
    $Folders = Get-ChildItem z:\ -Recurse | ? {$_.PSIsContainer -eq $true -and $_.Name -eq "Subsun" -or $_.Name -eq "PerfLogs"}
	If ($Folders){
	   foreach ($Folder in $Folders) { 
	    $Result += $Folder | Get-ChildItem -Recurse | Measure-Object -Sum Length | Select-Object `
	    @{N="Size";E={"{0:N2}" -f ($_.sum / 1MB) + " MB"}}
    Else {$Result += New-Object PsObject -Property @{Server=$Server;Path="No folder";Files="NA";Size="NA"}}
  Else {$Result += New-Object PsObject -Property @{Server=$Server;Path="No folder";Files="NA";Size="NA"}}
  Remove-PSDrive -Name z -ErrorAction SilentlyContinue
 Else {$Result += New-Object PsObject -Property @{Server=$Server;Path="Not pinging";Files="NA";Size="NA"}}
$Result | Select Server,Path,Files,Size | Export-Csv c:\report.csv -NoTypeInformation

Open in new window

LVL 65

Accepted Solution

RobSampson earned 250 total points
ID: 38762067
Hi, the third line you changed to
strFolderShare = "NDrive$"

should reflect the "Share Name" that is given to the folder on each server.  So, you should be able to manually browse to

on each server.  Similary, if you have the fourth line as
arrSubFolders = Array("Temp", "Users")

then you must be able to browse to

on each server.  If the folder is multiple levels deep from the shared folder, you can use
arrSubFolders = Array("Temp\Folder1", "Users\MyAccount")

to find

on each server.

I hope that helps.



Featured Post

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

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

Microsoft Windows Server Update Service (WSUS) is free for everyone, but it lacks of some desirable features like send an e-mail to the administrator with the status of all computers on the WSUS server. This article is based on my PowerShell script …
How to sign a powershell script so you can prevent tampering, and only allow users to run authorised Powershell scripts
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…

786 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