2009-04-30 4 views

Antwort

21

Versuchen Sie, die folgende

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

Dies ist eigentlich ein bisschen eine Zusammenfassung Objekt erzeugt, die die Anzahl der Elemente enthalten wird. Sie können nur wenn die Summe Eigenschaft greifen und dass die Summe der Längen

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

EDIT Warum funktioniert das sein?

Lassen Sie uns es durch Komponenten der Pipeline brechen. Der Befehl gci -re $root ruft alle Elemente aus dem Anfangsverzeichnis $root rekursiv ab und schiebt sie dann in die Pipeline. So wird jede einzelne Datei und jedes Verzeichnis unter der $root den zweiten Ausdruck ?{ -not $_.PSIsContainer } durchlaufen. Auf jede Datei/jedes Verzeichnis, die an diesen Ausdruck übergeben werden, kann über die Variable $_ zugegriffen werden. Das Vorhergehende? Gibt an, dass dies ein Filterausdruck ist, der nur Werte in der Pipeline enthält, die diese Bedingung erfüllen. Die PSIsContainer-Methode gibt true für Verzeichnisse zurück. Der Filterausdruck enthält also nur die Werte der Dateien. Das abschließende Cmdlet measure-Objekt summiert den Wert der Eigenschaft Length für alle in der Pipeline verbleibenden Werte. Es ruft im Wesentlichen Fileinfo.Length für alle Dateien im aktuellen Verzeichnis (rekursiv) auf und summiert die Werte.

+5

Nett. (Get-DirectorySize "Einige \ Datei \ Pfad"). Sum/1mb oder (Get-DirectorySize "Einige \ Datei \ Pfad"). Sum/1GB zu Megs oder Gigs zu konvertieren. – aphoria

+0

Können Sie erklären, wie das funktioniert? –

+0

@Gauenwolf, eine Bearbeitung zur Erläuterung hinzugefügt – JaredPar

2

Wenn Sie die Größe von versteckten Dateien und Systemdateien berücksichtigen möchten, sollten Sie den Parameter -force mit Get-ChildItem verwenden.

2

Hier ist eine schnelle Art und Weise eine Größe von bestimmten Dateierweiterungen zu erhalten:

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

Dank denen, die hier gepostet. Ich nahm das Wissen an, um dieses zu schaffen:

# 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