17 Stimmen

PowerShell-Skript zum Abrufen der Gesamtgröße eines Verzeichnisses

Ich muss die Größe eines Verzeichnisses rekursiv ermitteln. Ich muss dies jeden Monat tun, also möchte ich eine PowerShell Skript zu tun.

Wie kann ich das tun?

25voto

JaredPar Punkte 699699

Versuchen Sie Folgendes

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

Dies erzeugt eine Art zusammenfassendes Objekt, das die Anzahl der Elemente enthält. Sie können aber auch einfach die Eigenschaft "Summe" verwenden, die die Summe der Längen ist

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

EDITAR Warum funktioniert das?

Schauen wir uns die einzelnen Komponenten der Pipeline an. Die gci -re $root holt alle Einträge aus dem Startmenü $root Verzeichnis rekursiv und schieben sie dann in die Pipeline. So wird jede einzelne Datei und jedes Verzeichnis unter dem $root wird durch den zweiten Ausdruck ?{ -not $_.PSIsContainer } . Auf jede Datei / jedes Verzeichnis, das diesem Ausdruck übergeben wird, kann über die Variable $_ . Das vorangestellte ? zeigt an, dass es sich um einen Filterausdruck handelt, der bedeutet, dass nur Werte in der Pipeline verbleiben, die diese Bedingung erfüllen. Die PSIsContainer-Methode gibt für Verzeichnisse true zurück. Der Filterausdruck behält also nur die Werte von Dateien bei. Das abschließende Cmdlet measure-object summiert den Wert der Eigenschaft Length über alle in der Pipeline verbleibenden Werte. Es ruft also im Wesentlichen Fileinfo.Length für alle Dateien unter dem aktuellen Verzeichnis (rekursiv) auf und summiert die Werte.

3voto

Keith Hill Punkte 183005

Wenn Sie daran interessiert sind, die Größe von versteckten und Systemdateien einzubeziehen, sollten Sie den Parameter -force mit Get-ChildItem verwenden.

3voto

Gordon Bell Punkte 12689

Hier ist ein schneller Weg, um die Größe bestimmter Dateierweiterungen zu ermitteln:

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

3voto

youfoobar Punkte 41

Danke an alle, die hier gepostet haben. Ich habe das Wissen angenommen, um dies 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

0voto

carrvo Punkte 402

Zur Verfeinerung diese Antwort von @JaredPar zu erweitern und leistungsfähiger zu machen:

function Get-DirectorySize() {
  param ([string]$root = $(Resolve-Path .))
  Get-ChildItem $root -Recurse -File |
    Measure-Object -Property Length -Sum |
    Select-Object -ExpandProperty Sum
}

Oder, um die Nutzung bequemer zu machen, erkunden Typdaten :

Update-TypeData -TypeName System.IO.DirectoryInfo -MemberType ScriptProperty -MemberName Size -Value {
  Get-ChildItem $this -Recurse -File |
    Measure-Object -Property Length -Sum |
    Select-Object -ExpandProperty Sum
}

Dann verwenden Sie von Get-ChildItem | Select-Object Name,Length,Size

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X