为什么我不能遍历我的磁盘大小?

时间:2011-06-16 16:11:35

标签: powershell

这是一个非常简单的代码,我似乎无法使其正常运行 我想找到我电脑上的所有驱动器,然后想要显示它们的大小。

$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时,输出完全符合我的需要我甚至使用读取主机逐个检查它们并显示每个驱动器号。不幸的是,选择大小的命令不会返回任何内容。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

我可以更直观地遍历磁盘本身,而不是他们的ID,即

$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

答案 1 :(得分:2)

我真的不知道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))。上面的“其他选项”只迭代它们一次。

答案 2 :(得分:2)

尝试使用服务器端过滤时,如果可以使用Filter参数而不是Where-Object cmdlet(客户端过滤),则执行速度更快。后者首先获取所有对象,然后才执行过滤。

Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3 AND DeviceId='$($i):'" | Select-Object Size