Восстановление емкости диска с помощью powershell

Я сделал этот код для подсчета емкости диска, но когда я запускаю его только с SSD на моем ноутбуке, я получаю 0 ГБ. после того, как я вставил USB/ внешнее пространство, он считает ssd + 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"

Это отлично работает -> $disk.Size

Почему он не занимает первое [0] в моем цикле for?

2 ответа

Решение

Я не могу ответить, почему ваш for Цикл не работает, не наблюдая за вашей средой, но для него почти никогда не бывает прецедента. Вы должны вместо этого выбрать foreach цикл:

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

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

Предположим, что Windows 10, так как вы не упомянули ОС и CMDLETS в Windows 10, намного лучше. * См. Внизу версию для Windows 7.

Для информации о диске я предпочитаю использовать Get-PhysicalDisk, например, так:

$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

В моей среде, где у меня есть один SSD и один механический жесткий диск, он вернется:

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

Если вы хотели получить информацию только для SSD, например, вы можете сделать это:

$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

Который возвращает только SSD:

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

Объяснение: Подключен диск Foreach, имя хранилища, тип носителя и емкость в переменных. * Разделите емкость байта на 1 ГБ, чтобы получить лучшее число для просмотра. Все еще в Foreach, создавайте пользовательский объект на каждой итерации, содержащий 3 переменные.

Все вместе, вы можете вывести свою переменную DiskInfo, которая содержит все объекты.

Если в Windows 7 тип носителя недоступен, вы не сможете его использовать. Вместо этого вы можете сделать:

$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

Который вернет что-то вроде:

Name                       Capacity (GB)
----                       -------------
SAMSUNG MZ7TY256HDHP-000L7           238
ST500LX025-1U717D                    466
Другие вопросы по тегам