2011-06-16 36 views
1

这是非常简单的代码,我似乎无法使功能正常 我想找到我的计算机上的所有驱动器,然后,要显示它们的大小。为什么我无法循环访问磁盘大小?

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

当$显示我的输出是完全一样的,我需要它,我竟然用一个读主机检查逐一并显示每一个驱动器号。不幸的是,选择大小的命令不会返回任何内容。

感谢您的帮助!

回答

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 
+2

你只是在模拟一个'select -expandproperty size'。 – Joey 2011-06-16 16:43:01

+0

+1的确,谢谢指出。我从未注意到那个开关。 – triazotan 2011-06-16 16:51:02

+1

嗯,*技术上*相当于'($ disks = gwmi win32_LogicalDisk | Where {$ _。DriveType -eq“3”})|选择-exp size',因为你还剩下'$ disks'变量;-) – Joey 2011-06-16 20:16:12

2

我真的不知道powershell,但我想我会搞砸你的脚本。看起来像“$我”是错误的 - 而不是使用$ 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

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

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