2011-06-16 66 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