Почему я не могу просмотреть размер диска? - PullRequest
1 голос
/ 16 июня 2011

Это очень простой код, который я не могу сделать правильно Затем я хочу найти все накопители на моем компьютере и показать их размер.

$disks = gwmi win32_LogicalDisk | Where {$_.DriveType -eq "3"} | Select DeviceID
foreach ($i in $disks){
$i
gwmi win32_logicaldisk | Where {$_.DeviceID -eq "$i"} | Select Size
}

При отображении $ i вывод получается именно так, как мне нужно, я даже использовал Read-Host, чтобы проверять их одну за другой, и отображается каждая буква диска. К сожалению, команда Выбрать размер ничего не возвращает.

Спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

Для меня было бы более интуитивно понятно перебирать сами диски, а не их идентификаторы, т.е.

$disks = gwmi win32_LogicalDisk | Where {$_.DriveType -eq "3"}
foreach ($disk in $disks)
{
    $disk.Size
}

$disk | Select Size также работает, и, как аккуратно дополняет Джои, все это эквивалентно

gwmi win32_LogicalDisk | Where {$_.DriveType -eq "3"} | Select -ExpandProperty Size
2 голосов
/ 19 июня 2011

Старайтесь использовать фильтрацию на стороне сервера, когда всегда можно использовать параметр Filter вместо командлета Where-Object (фильтрация на стороне клиента), он работает быстрее. Последний сначала получает ВСЕ объекты, а затем выполняет фильтрацию.

Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3 AND DeviceId='$($i):'" | Select-Object Size 
2 голосов
/ 16 июня 2011

Я на самом деле не знаю powershell, но я решил, что я возиться с вашим сценарием.Мне кажется, что «$ i» неверно - вместо этого используйте $ i.DeviceID (без кавычек).Весь сценарий, который мне подходит:

$disks = gwmi Win32_LogicalDisk | Where {$_.DriveType -eq "3"} | Select DeviceID
foreach ($i in $disks){
$i.DeviceID
gwmi Win32_LogicalDisk | Where {$_.DeviceID -eq $i.DeviceID} | Select Size
}

Другой вариант - пропустить итерацию:

gwmi Win32_LogicalDisk | Where {$_.DriveType -eq "3"} | Select DeviceID, Size

Алгоритмически я бы порекомендовал это на основе выполнения - подход, который вы используетевзятие теперь итерирует по всем устройствам два раза внутри циклов (в основном O (n ^ 2)).«Другой вариант» выше повторяет их только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...