2009-04-30 138 views

回答

21

請嘗試以下

function Get-DirectorySize() { 
    param ([string]$root = $(resolve-path .)) 
    gci -re $root | 
    ?{ -not $_.PSIsContainer } | 
    measure-object -sum -property Length 
} 

這實際上產生了一下彙總對象將包括項目的計數。你可以只搶了總財產,雖然這將是長度

$sum = (Get-DirectorySize "Some\File\Path").Sum 

編輯的總和爲什麼這項工作?

讓我們按照管道的組成部分對其進行細分。 gci -re $root命令將遞歸地從起始$root目錄中獲取所有項目,然後將它們推送到管道中。因此,$root下的每個文件和目錄都將通過第二個表達式?{ -not $_.PSIsContainer }。傳遞給此表達式的每個文件/目錄都可以通過變量$_訪問。前面的?表示這是一個過濾器表達式,意思是隻保留滿足這個條件的管道中的值。 PSIsContainer方法將爲目錄返回true。所以實際上,過濾器表達式只保留文件值。最終的cmdlet度量對象將在流水線中剩餘的所有值上累加屬性Length的值。所以它本質上是調用Fileinfo.Length來獲取當前目錄下的所有文件(遞歸)並對這些值進行求和。

+5

不錯。 (Get-DirectorySize「Some \ File \ Path」)。Sum/1mb或(Get-DirectorySize「Some \ File \ Path」)。Sum/1gb轉換爲megs或gigs。 – aphoria 2009-04-30 22:31:17

2

如果您對包含隱藏文件和系統文件的大小感興趣,那麼您應該在Get-ChildItem中使用-force參數。

2

這裏是快速的方法來獲得特定的文件擴展名大小:

(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum 
1

感謝那些誰張貼在這裏。我通過知識來創造這個:

# Loops through each directory recursively in the current directory and lists its size. 
# Children nodes of parents are tabbed 

function getSizeOfFolders($Parent, $TabIndex) { 
    $Folders = (Get-ChildItem $Parent);  # Get the nodes in the current directory 
    ForEach($Folder in $Folders)   # For each of the nodes found above 
    { 
     # If the node is a directory 
     if ($folder.getType().name -eq "DirectoryInfo") 
     { 
      # Gets the size of the folder 
      $FolderSize = Get-ChildItem "$Parent\$Folder" -Recurse | Measure-Object -property length -sum -ErrorAction SilentlyContinue; 
      # The amount of tabbing at the start of a string 
      $Tab = " " * $TabIndex; 
      # String to write to stdout 
      $Tab + " " + $Folder.Name + " " + ("{0:N2}" -f ($FolderSize.Sum/1mb)); 
      # Check that this node doesn't have children (Call this function recursively) 
      getSizeOfFolders $Folder.FullName ($TabIndex + 1); 
     } 
    } 
} 

# First call of the function (starts in the current directory) 
getSizeOfFolders "." 0