Modro
Modro

Reputation: 436

Retrieving disk capacity with powershell

I made this code to count disk capacity, but when i run it with only the SSD in my laptop i get 0GB. after I insert USB/external space it count the ssd + the USB.

$disk = Get-WmiObject Win32_DiskDrive

$capacity = 0;

for($i = 0;$i -lt $disk.Count; $i++){
    $capacity = $capacity + [math]::round(($disk[$i].Size/1GB),2)
}


Write-Host $capacity "GB"

This works fine -> $disk.Size

Why does it not take the first [0] in my for loop?

Upvotes: 0

Views: 3222

Answers (2)

Rakha
Rakha

Reputation: 2064

Assuming Windows 10 since you didn't mention OS and the CMDLETS in Windows 10 are so much better. *See at the bottom for a Windows 7 version.

For disk information, I prefer using Get-PhysicalDisk, like this for example:

$DiskInfo = foreach ($disk in Get-PhysicalDisk) {

[string]$name = $disk.FriendlyName
[string]$type = $disk.MediaType
[int]$capacity = $disk.size / 1GB

    [pscustomobject]@{
    "Type"=$type;
    "Name"=$name;
    "Capacity (GB)"=$capacity;
    }

}


$DiskInfo

In my environement where I have one SSD and one mechanical HDD, it will return:

Name                       Type Capacity (GB)
----                       ---- -------------
SAMSUNG MZ7TY256HDHP-000L7 SSD            238
ST500LX025-1U717D          HDD            466

If you wanted information for JUST the SSD for example, you could do this :

$DiskInfo = foreach ($disk in Get-PhysicalDisk | Where-Object {$_.MediaType -eq "SSD"} ) {

[string]$name = $disk.FriendlyName
[string]$type = $disk.MediaType
[int]$capacity = $disk.size / 1GB

    [pscustomobject]@{
    "Type"=$type;
    "Name"=$name;
    "Capacity (GB)"=$capacity;
    }

}


$DiskInfo

Which returns only the SSD:

Type Name                       Capacity (GB)
---- ----                       -------------
SSD  SAMSUNG MZ7TY256HDHP-000L7           238

Explanation: Foreach disk connected, store name, media type and capacity in variables. *Divide byte capacity by 1GB to get a better number to look at. Still in the Foreach, create a custom object at every iteration containing the 3 variables.

All put together, you can then output your variable DiskInfo which contains all the objects.

If on Windows 7, media type isn't available so you can't use it. Instead you can do:

$DiskInfo = foreach ($disk in Get-WmiObject -Class Win32_DiskDrive) {

[string]$name = $disk.model
[int]$capacity = $disk.size / 1GB

    [pscustomobject]@{
    "Name"=$name;
    "Capacity (GB)"=$capacity;
    }

}


$DiskInfo

Which will return something like:

Name                       Capacity (GB)
----                       -------------
SAMSUNG MZ7TY256HDHP-000L7           238
ST500LX025-1U717D                    466

Upvotes: 0

Maximilian Burszley
Maximilian Burszley

Reputation: 19664

I cannot answer why your for loop is failing without observing your environment, but there is almost never a use-case for it. You should instead opt for a foreach loop:

$capacity = foreach ($disk in Get-WmiObject -Class Win32_DiskDrive)
{
    [Math]::Round(($disk.Size / 1GB), 2)
}

"$(($capacity | Measure-Object -Sum).Sum)GB"

Upvotes: 2

Related Questions