2012-11-06 25 views
2

我正在嘗試創建一個函數以返回MB中的可用驅動器空間量。該函數將路徑名稱作爲參數,並且必須處理掛載點。我的硬盤都設置這樣的:獲取PowerShell中提供的驅動器路徑的可用空間

  • C:\ - Disk0上
  • G:\ - 磁盤1
  • G:\數據 - 磁盤2

所以我想要做的事,如:

function Get-FreeSpace { 
    param (
     $path 
    ); 

    # iterate through and find the volume, detect if in a mount point and return free space 
    # 

    return [int]$freeSpace; 
} 

我看過使用這個數組作爲我的函數的起點,但我陷入了困境。

$vols = Get-WMIObject Win32_Volume -filter "DriveType=3" -computer $computerName | Select Caption,DriveLetter,Label,@{Name="DiskSize(GB)";Expression={[decimal]("{0:N1}" -f($_.capacity/1gb))}},@{Name="PercentFree(%)";Expression={"{0:P2}" -f(($_.freespace/1mb)/($_.capacity/1mb))}}

$vols返回一個PSCustomObjectSystem.Array類型。所以,如果我傳遞給函數以下路徑:

  • G:\Data\My\Test\Path
  • G:\Data

它會發現G:\Data的自由空間掛載點。

如果我通過它G:\Some\Other\Path,它將返回G:\驅動器的可用空間。我想這樣使用它:$freeSpace = Get-FreeSpace "G:\Some\Other\Path"

我將不勝感激任何幫助。

回答

3

試試這個:

function Get-FreeSpace { 
    param (
    $path 
); 

    if ($path[-1] -ne '\') { $path += '\' } 
    $filter = "DriveType=3 And Name='$($path -replace '\\', '\\')'" 
    $free = (gwmi Win32_Volume -Filter $filter | select FreeSpace).freespace 
    return ($free/(1024*1024)) 
} 

您需要在$path加倍反引號,因爲它們必須逃過WMI查詢。爲此(看起來很讓人困惑),您必須用'\\'替換'\\',因爲第一次出現的是正則表達式,其中反斜槓必須轉義,而第二次出現是帶有雙反斜槓的字符串文字。

更新:

要匹配,你可以使用-Like操作部分路徑:

function Get-FreeSpace { 
    param (
    $path 
); 

    $free = gwmi Win32_Volume -Filter "DriveType=3" ` 
    | where { $path -Like "$($_.Name)*" } ` 
    | sort Name -Desc ` 
    | select -First 1 FreeSpace ` 
    | % { $_.freespace/(1024*1024) } 
    return ([int]$free) 
} 

where子句選擇所有匹配$path部分路徑掛載點,以及隨後sort | select選擇最長匹配的那個。

注意:我知道,如果將管道放在管道末端,我不必逃避換行,但我更喜歡在新管道的開始處放置管道。這樣您就可以立即看到從前一行繼續流水線的位置。

+0

差不多!謝謝回覆。我也需要它爲子文件夾工作。仔細閱讀我的問題的最後部分。如果我有一個2GB可用空間的驅動器作爲G:\ Data的安裝點,並且我傳入G:\ Data \ SubFolder,則返回0,而不是掛載點的可用空間。同樣,您的功能不適用於根驅動器的子文件夾。所以,如果G:\ Log不是一個掛載點,我將它傳遞給函數,我也得到0。 –

相關問題