PowerShell: How to retrieve disk size & free disk space for a list of computers (input file)
Posted by bartvdw on 1919/0606/2008
Note: works only with V2 which is currently in CTP stage!
The command below will show you a very nice overview of disk size & free space for a list of computers (input file). The great thing about PowerShell, from my point of view, is “piping” commands into 1 big command which eliminates the need to create a script for certain operations. Secondly in V2 (CTP), the “gridview” option is amazing!
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\scripts\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}},@{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}} | Out-GridView
ghanshyam said
wow! Thats a awesome script
abdul said
thanks for the script…works great…how do i get this to output to a file and send an email to myself?
I tried to pipeline to csv or txt…but it failed. shouldnt it just be this:
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\scripts\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}},@{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}} | Export-CSV drivesizes.csv
$msg = new-object Net.Mail.MailMessage
$att = new-object Net.Mail.Attachment($filename)
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = “admin”
$msg.To.Add(”admin”)
$msg.Subject = “drive size”
$msg.Body = “The drive size file is attached”
$msg.Attachments.Add($att)
$smtp.Send($msg
Am I missing something? any help will be appreciated…thanks.
Addy said
try Export-csv -path .\drivesizes.csv
Addy said
you can also try. Using the -append argument will write to the same file in case you are going through an array of computers and need info in the same file.
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\scripts\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}},@{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}} | out-file -filepath .\drivesizes.csv -append
Ray said
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\computers.txt) | It’s not working for me… what am I doing wrong. I have version 2.
Select SystemName,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={”{0:N1}” -f($_.size/1gb)}},@{Name=”freespace(GB)”;Expression={”{0:N1}” -f($_.freespace/1gb)}} | Out-GridView
Unexpected token ‘:N1’ in expression or statement.
At line:1 char:169
Unexpected token ‘:N1’ in expression or statement.
At line:1 char:231
Encountered end of line while processing a string token.
At line:1 char:274
Ray said
Figured it out. The script didn’t copy over properly.
Victor said
Hi I have this error…………where I am wrong?
PS C:\Documents and Settings\MSIP35> Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\scripts\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={”{0:N1}” -f($_.size/1gb)}},@{Name=”freespace(GB)”;Expression={”{0:N1}” -f($_.freespace/1gb)}} | Out-GridView
Unexpected token ‘:N1’ in expression or statement.
At line:1 char:177
Unexpected token ‘:N1’ in expression or statement.
At line:1 char:239
Encountered end of line while processing a string token.
At line:1 char:282
David said
Nice little script!
I had to change all the quotes into “straight quotes” after copying/pasting into my PowerShell window in order for it to work.
Then I added a calculated field to the grid output to show the percent free on each HD. The calculation works correctly, but displays as a long decimal ( .6934270627776, for example). How do I get that to show as 69 or 69%?
I also made a couple of minor edits for cosmetic changes to the grid.
Here’s what I currently have:
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\scripts\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name=”Size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}},@{Name=”Free Space(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}},@{Name=”Free Space(%)”;Expression={“{0:N1}” -f($_.freespace/1gb) / ($_.size/1gb)}} | Out-GridView -Title “Drive Space”
Viktor Korshunov said
2David:
it’s siple, only multiplay on 100
exaple:
-f(100 * ($_.freespace/1gb) / ($_.size/1gb))
2bartvdw:
thanx for your post
Pimp said
Here is the command with the percent calculated and formatted correctly in the gridview window.
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer localhost | Select SystemName,DeviceID,VolumeName,@{Name=”Size(GB)”;Expression={‘{0:N1}’ -f($_.size/1gb)}},@{Name=”Free Space(GB)”;Expression={‘{0:N1}’ -f($_.freespace/1gb)}},@{Name=”Free Space(%)”;Expression={‘{0:P2}’ -f(($_.freespace/1gb) / ($_.size/1gb))}} | Out-GridView -Title “Drive Space”
Aboufares said
Instead og 1gb use 2^30
Echo said
could someone please let me know how to add the values of the different drives it polls and report the total disk space on the system
e.g. SystemName Dev ID Size(gb) TotalSize
server x c 10gb 50GB
server x e 15gb
server x f 25gb
Andy said
I added [decimal] so the numbers sort correctly
Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" -computer localhost | Select SystemName,DeviceID,VolumeName,@{Name="Size(GB)";Expression={[decimal]("{0:N1}" -f($_.size/1gb))}},@{Name="Free Space(GB)";Expression={[decimal]("{0:N1}" -f($_.freespace/1gb))}},@{Name="Free Space(%)";Expression={"{0:P2}" -f(($_.freespace/1gb) / ($_.size/1gb))}} | Out-GridView -Title "Drive Space"
Stanley said
This is a great script, however I can not get it to parse my text file. If I give it one server name at a time it works without any problems. I get this error message when attempting to give the script a text file.
Get-WmiObject : Cannot validate argument on parameter ‘ComputerName’. The argument is null or empty. Supply an argument
that is not null or empty and then try the command again.
At line:1 char:95
+ Get-WMIObject Win32_LogicalDisk -filter “DriveType=3” -computer <<<< (Get-Content c:\
scripts\servers.txt) | Select SystemName,DeviceID,VolumeName,@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@
{Name="freespace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | Out-GridView
+ CategoryInfo : InvalidData: (:) [Get-WmiObject], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Bruce said
you need a loop to process each computer. You will get a grid for each server, unless you drop the output into a hash table then output it.
##
$servers = Get-Content C:\scripts\data\servers.txt
foreach ($server in $servers){
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ `
| Select SystemName,DeviceID,VolumeName,`
@{Name=”Size(GB)”;Expression={[decimal](“{0:N1}” -f($_.size/1gb))}},`
@{Name=”Free Space(GB)”;Expression={[decimal](“{0:N1}” -f($_.freespace/1gb))}},`
@{Name=”Free Space(%)”;Expression={“{0:P2}” -f(($_.freespace/1gb) / ($_.size/1gb))}}
}}
##
Bruce said
$servers = Get-Content C:\scripts\data\servers.txt
foreach ($server in $servers){
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer $server `
| Select SystemName,DeviceID,VolumeName,`
@{Name=”Size(GB)”;Expression={[decimal](“{0:N1}” -f($_.size/1gb))}},`
@{Name=”Free Space(GB)”;Expression={[decimal](“{0:N1}” -f($_.freespace/1gb))}},`
@{Name=”Free Space(%)”;Expression={“{0:P2}” -f(($_.freespace/1gb) / ($_.size/1gb))}}
}
doh – forgot to put the $server variable in the gwmi portion.
Powershell script to find free disk space for multiple servers « You've got mail! said
[…] This post has the command I needed. […]
jay said
Thank you very much this really helped.!!
Tom Purl said
Awesome script. Thanks for sharing!
Marcel said
Thanks for sharing!
There is one thing that keeps bothering me, and that is the fact that sorting by Free Space (%) does not work like expected. When using sort “Free Space(%)” the output is like 88.23 %, 89.36 %, 9.01 %, 9.94 %, 90.07 %.
Of course the 9.01%, the lowest of them all, should be on top of the list. How can I make Powershell sort numbers as numbers and not as text?
Jay said
Modified to show Used space instead of Free Space.
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name=”Size(GB)”;Expression={[decimal](“{0:N1}” -f($_.size/1gb))}},@{Name=”Used Space(GB)”;Expression={[decimal](“{0:N1}” -f(($_.size/1gb)-($_.freespace/1gb)))}},@{Name=”Used Space(%)”;Expression={“{0:P2}” -f((($_.size/1gb) – ($_.freespace/1gb)) / ($_.size/1gb))}} | Out-GridView -Title “Drive Space”
Roberto said
When I copy and paste your script:
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer (Get-Content c:\scripts\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}},@{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}} | Out-GridView
I get this error:
Unexpected token ‘:N1’ in expression or statement.
At line:1 char:180
+ Get-WMIObject Win32_LogicalDisk -filter “DriveType=3? -computer (Get-Content c:\scripts\computers.txt) | Select Syste
mName,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={“{0:N1 <<<>
And not the information I need
Johnny said
Roberto, Im sure you have figured it out by now but I also ran into the same issue.
Solution: Replace all the speech marks again. Its a copy and paste issue.
Good Luck and many Thanks,
A
Paul LaVigne said
Excellent script (once I figured out how to handle the unexpected token error by changing all the quotes to straight quotes)
Question: How would I format the output to keep all of the drives for a particular server name on the same line (row), instead of creating a new line for each drive?
Mayank said
Me too getting this error….
Mail Man said
There is mistake in quotation mark. You should replace them with normal quotation mark sign “
meda said
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer $VM | Select SystemName,DeviceID,VolumeName,@{Name=”Size(GB)”;Expression={[decimal](“{0:N1}” -f($_.size/1gb))}},@{Name=”Free Space(GB)”;Expression={[decimal](“{0:N1}” -f($_.freespace/1gb))}},@{Name=”Free Space(%)”;Expression={“{0:P2}” -f(($_.freespace/1gb) / ($_.size/1gb))}} | ft -auto
this worked great . it misses the mount point volumes.
Adelo said
This is awesome but is there anyway to get the % of space utilized or % of free space?
Andrew James said
Anyway we can export this to a CSV? I’m having a time getting it to do that. Kind of a beginner with ps scripting, any help greatly appreciated.
rsr72 said
Nice!
Jon said
Copy and pasted the above command, but it can not seem to find that text file. Any ideas?
Jon said
Get-Content : Cannot find path ‘C:\Scripts\computers.txt’ because it does not exist.
At C:\Scripts\Disk_Size_Script.ps1:3 char:27
+ $strComputer = get-content <<<< "computers.txt"
+ CategoryInfo : ObjectNotFound: (C:\Scripts\computers.txt:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
Jon said
NM fat fingered
Octive said
Here is what I came up with,
I opted for the grid view and creating a .csv file to help with my reporting.
$servers = Get-Content C:\drivesize\computers.txt
$DriveSize = foreach($server in $servers){
Get-WMIObject Win32_LogicalDisk -filter “DriveType=3″ -computer $server `
| Select SystemName,DeviceID,VolumeName,`
@{Name=”Size(GB)”;Expression={[decimal](“{0:N1}” -f($_.size/1gb))}},`
@{Name=”Used Space(GB)”;Expression={[decimal](“{0:N1}” -f(($_.size/1gb)-($_.freespace/1gb)))}},`
@{Name=”Used Space(%)”;Expression={“{0:P2}” -f((($_.size/1gb) – ($_.freespace/1gb)) / ($_.size/1gb))}}
}
$DriveSize | Out-GridView -Title ‘Drive Size’
$DriveSize | Export-CSV -Path “c:\drivesize\drive.csv” -NoTypeInformation
Sayed said
Thank you so much everyone on this thread. damn good script. it made my worked really easy.
Jose said
You can use this scritp:
code:
Mountpointspacetest.ps1
# ———-start of mountpointspacetest.ps1—————————————————————-
$TotalGB = @{Name=”Capacity(GB)”;expression={[math]::round(($_.Capacity/ 1073741824),2)}}
$FreeGB = @{Name=”FreeSpace(GB)”;expression={[math]::round(($_.FreeSpace / 1073741824),2)}}
$FreePerc = @{Name=”Free(%)”;expression={[math]::round(((($_.FreeSpace / 1073741824)/($_.Capacity / 1073741824)) * 100),0)}}
function get-mountpoints {
$volumes = Get-WmiObject -computer $server win32_volume
$volumes | Select SystemName, Label, DriveLetter, $TotalGB, $FreeGB, $FreePerc
}
$servers = (Get-Content .\servers.txt)
foreach ($server in $servers){
get-mountpoints
}
# ———-end of mountpointspacetest.ps1—————————————————————-
Servers.txt
# ———-start of servers.txt—————————————————————-
ECEVS01
spevs011
frxevs01
# ———-end of servers.txt—————————————————————-
create severs. txt file.
Run this scritp from powershell script like:
SP1>\Mountpointspacetest.ps1 | EXPORT-CSV -PATH C:\REPORT\MountSpace-Report.csv.
Jerry said
Great Script!
For the error regarding the quotes, I simply removed the quotes from “DriveType=3″ and everything became happy Big thanks also to those also showing the variations! very useful and much appreciated!
Cheers,
Jerry
Jig said
I would like to add OS version and make/model of the server in the same output. Anyway to accomplish that?
Wim said
Hello i’m new in powershell can you help me with 2 questions.
1) I want to run the PS only for drive F:\ (how to get this done?)
2) I want to run de PS from de scheduler how to do this.
Thanks
Steve said
Awesome script. Updated to use CIM as per: https://blogs.technet.microsoft.com/heyscriptingguy/2016/02/08/should-i-use-cim-or-wmi-with-windows-powershell/
$cim = new-cimsession -comp comp1, comp2,comp3,comp4
Get-CimInstance -ClassName Win32_LogicalDisk -filter ‘DriveType=3’ -CimSession $cim | Select SystemName,DeviceID,VolumeName,@{Name=”Size(GB)”;Expression={‘{0:N1}’ -f($_.size/1gb)}},@{Name=”Free Space(GB)”;Expression={‘{0:N1}’ -f($_.freespace/1gb)}},@{Name=”Free Space(%)”;Expression={‘{0:P2}’ -f(($_.freespace/1gb) / ($_.size/1gb))}} | Out-GridView -Title “Drive Space”