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))}}

$volsSystem.Arrayの型を返していPSCustomObjectます。したがって、関数に次のパスを渡すと:

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

G:\Dataマウントポイントの空き容量を見つけます。

渡すとG:\Some\Other\PathG:\ドライブの空き容量が返されます。私はそれを次のように使いたい:$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))
}

$pathWMI クエリではバックスラッシュをエスケープする必要があるため、バックスラッシュを 2 つにする必要があります。そのためには (混乱するかもしれませんが) に置き換える必要があります。これ'\\''\\'、最初の出現はバックスラッシュをエスケープする必要がある正規表現であり、2 番目の出現は二重のバックスラッシュを含む文字列リテラルであるためです。

アップデート:

-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 に答える