2009-04-30 14 views

Odpowiedz

21

Wypróbuj następujące

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

To rzeczywiście daje trochę obiektu zbiorczego który obejmie ilość elementów. Można po prostu chwycić właściwość Sum choć i to będzie suma długości

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

EDIT Dlaczego to działa?

Złam to przez komponenty rurociągu. Polecenie gci -re $root spowoduje, że wszystkie elementy z początkowego katalogu będą rekursywnie uruchamiane, a następnie wprowadzane do potoku. Tak więc każdy pojedynczy plik i katalog pod $root przejdzie przez drugie wyrażenie ?{ -not $_.PSIsContainer }. Każdy plik/katalog przekazany do tego wyrażenia można uzyskać poprzez zmienną $_. Poprzednie? wskazuje, że jest to wyrażenie filtru, oznaczające zachowanie tylko wartości w potoku, które spełniają ten warunek. Metoda PSIsContainer zwróci wartość true dla katalogów. W efekcie wyrażenie filtru zachowuje tylko wartości plików. Ostateczny cmdlet measure-object zsumuje wartość właściwości Length dla wszystkich wartości pozostałych w potoku. Więc zasadniczo nazywa się Fileinfo.Length dla wszystkich plików w bieżącym katalogu (rekursywnie) i sumuje wartości.

+5

Nice. (Get-DirectorySize "Some \ File \ Path") .Suma/1mb lub (Get-DirectorySize "Some \ File \ Path"). Suma/1GB do konwersji na megs lub koncerty. – aphoria

+0

Czy możesz wyjaśnić, jak to działa? –

+0

@Gauenwolf, dodano edycję dla wyjaśnienia – JaredPar

2

Jeśli interesuje Cię rozmiar plików ukrytych i systemowych, powinieneś użyć parametru -force z Get-ChildItem.

2

Oto szybki sposób na wielkość poszczególnych rozszerzeń plików:

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

Dzięki tym, którzy napisali tutaj. Przyjąłem wiedzę, aby to zrobić:

# 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 
Powiązane problemy