Ich muss die Größe eines Verzeichnisses rekursiv ermitteln. Ich muss dies jeden Monat tun, also möchte ich ein PowerShell Skript machen, um es zu tun.PowerShell-Skript zum Abrufen einer Verzeichnisgesamtgröße
Wie kann ich es tun?
Ich muss die Größe eines Verzeichnisses rekursiv ermitteln. Ich muss dies jeden Monat tun, also möchte ich ein PowerShell Skript machen, um es zu tun.PowerShell-Skript zum Abrufen einer Verzeichnisgesamtgröße
Wie kann ich es tun?
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.
Wenn Sie die Größe von versteckten Dateien und Systemdateien berücksichtigen möchten, sollten Sie den Parameter -force mit Get-ChildItem verwenden.
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 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
Nett. (Get-DirectorySize "Einige \ Datei \ Pfad"). Sum/1mb oder (Get-DirectorySize "Einige \ Datei \ Pfad"). Sum/1GB zu Megs oder Gigs zu konvertieren. – aphoria
Können Sie erklären, wie das funktioniert? –
@Gauenwolf, eine Bearbeitung zur Erläuterung hinzugefügt – JaredPar