4

我正在尝试创建一个函数来返回以 MB 为单位的可用驱动器空间量。该函数将路径名作为参数,并且必须处理挂载点。我的驱动器是这样设置的:

  • C:\ - 磁盘0
  • 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正在返回一个System.Array类型PSCustomObject。因此,如果我通过以下路径传递函数:

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

它将找到G:\Data挂载点的可用空间。

如果我通过它G:\Some\Other\Path,它将返回G:\驱动器的可用空间。我想像这样使用它:$freeSpace = Get-FreeSpace "G:\Some\Other\Path"

如果有任何帮助,我将不胜感激。

4

2 回答 2

4

试试这个:

function Get-FreeSpace {
    Param(
        $path
    );

    if ($path[-1] -ne '\') { $path += '\' }
    $filter = "DriveType=3 And Name='$($path -replace '\\', '\\')'"
    $free = Get-WmiObject Win32_Volume -Filter $filter |
            Select-Object -Expand FreeSpace
    return ($free / (1024*1024))
}

您需要将 中的反斜杠加倍$path,因为它们必须为 WMI 查询转义。为此(可能看起来令人困惑)您必须替换'\\''\\',因为第一次出现是正则表达式,其中反斜杠必须被转义,而第二次出现是带有双反斜杠的字符串文字。

更新:

要匹配部分路径,您可以使用-like运算符:

function Get-FreeSpace {
    Param(
        $path
    );

    $free = Get-WmiObject Win32_Volume -Filter "DriveType=3" |
            Where-Object { $path -like "$($_.Name)*" } |
            Sort-Object Name -Desc |
            Select-Object -First 1 FreeSpace |
            ForEach-Object { $_.FreeSpace / (1024*1024) }
    return ([int]$free)
}

Where-Object子句选择具有部分路径匹配的所有挂载点,$path随后Sort-Object | Select-Object选择具有最长匹配的挂载点。

于 2012-11-06T14:07:40.980 回答
3

一个更简单的变体:

function Get-FreeSpace {
    param ([string]$path);
    $space = (Get-Volume -FilePath $path).SizeRemaining;
    return [int64]($space / (1024 * 1024)); # this would otherwise be a float
}

Get-Volume -FilePath检索与提供的路径关联的卷;从该卷中,我们提取SizeRemaining并划分出 1MB。强制转换为 int64 是因为该操作将返回浮点数。

于 2018-08-01T19:31:01.960 回答