2012-11-06 3 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

System.Array PSCustomObject 타입을 반환한다. 나는이 기능을 다음과 같은 경로를 통과한다면 :

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

을 그것은 G:\Data의 여유 공간을 찾을 수 마운트 지점입니다.

G:\Some\Other\Path을 전달하면 G:\ 드라이브의 여유 공간이 반환됩니다. 나는 그것을 이렇게 사용하고 싶다. $freeSpace = Get-FreeSpace "G:\Some\Other\Path"

나는 어떤 도움도 감사 할 것이다.

답변

3

이 시도 : 그들은 WMI 쿼리에 탈출해야하기 때문에

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에 백 슬래시를 두 배로해야합니다. 첫 번째 어커런스는 백 슬래시가 이스케이프 처리되어야하는 정규 표현식이고 두 번째 어커런스는 이중 백 슬래시가있는 문자열 리터럴이기 때문에 '\\''\\'으로 대체해야합니다 (혼란 스러울 수 있음).

업데이트 :

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 선택 :

당신이 -Like 연산자를 사용할 수있는 부분 경로를 일치 시키려면 가장 긴 일치를 가진 사람.

참고 : 줄 끝 부분에 파이프를 놓으면 줄 바꿈을 벗어날 필요가 없지만 새 줄 시작 부분에 파이프를 놓는 것이 더 좋습니다. 이렇게하면 파이프 라인이 이전 행에서 계속 된 곳을 즉시 볼 수 있습니다.

+0

거의! 답장을 보내 주셔서 감사합니다. 하위 폴더에서도 작동해야합니다. 내 질문의 마지막 부분을 자세히 읽어보십시오.G : \ Data의 마운트 지점으로 2GB의 여유 공간이있는 드라이브가 있고 G : \ Data \ SubFolder를 통과하면 마운트 지점의 여유 공간이 아닌 반환 된 0이 표시됩니다. 마찬가지로 루트 드라이브의 하위 폴더에서는이 기능이 작동하지 않습니다. 따라서 G : \ Log가 마운트 포인트가 아니며 함수에 전달하면 0이됩니다. –

관련 문제