Frage

Ich brauche die Größe eines Verzeichnisses zu erhalten, rekursiv. Ich habe dies jeden Monat tun, damit ich einen Powershell Skript machen will, es zu tun.

Wie kann ich es tun?

War es hilfreich?

Lösung

Versuchen Sie, die folgende

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

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

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

Bearbeiten Warum funktioniert das?

Lassen Sie uns es brechen, indem Komponenten der Pipeline nach unten. Der gci -re $root Befehl werden alle Elemente aus dem Start $root Verzeichnis rekursiv erhalten und sie dann schieben Sie in die Pipeline. So jede einzelne Datei und Verzeichnis unter dem $root werden die zweiten Ausdruck ?{ -not $_.PSIsContainer } passieren. Jede Datei / Verzeichnis, wenn dieser Ausdruck übergeben kann durch die variable $_ zugegriffen werden. Die vorhergehende? zeigt dies ein Filterausdruck ist nur Werte in der Pipeline Sinne halten, die diese Bedingung erfüllen. Die PSIsContainer Methode gibt true zurück, für Verzeichnisse. Also in der Tat der Filterausdruck hält nur Dateien Werte. Die endgültige Cmdlets Maßnahme-Objekt den Wert der Eigenschaft Länge auf alle Werte in der Pipeline verbleibenden summieren. So ist es im Wesentlichen FileInfo.Length für alle Dateien im aktuellen Verzeichnis (rekursiv) und Summieren der Werte aufrufen.

Andere Tipps

Wenn Sie in mit der Größe von versteckten Dateien und Systemdateien interessiert sind, dann sollten Sie die -force-Parameter mit Get-ChildItem verwendet werden.

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

Dank denen, die hier gepostet. Ich nahm die Kenntnis dieses zu erstellen:

# 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top