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?
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?
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.
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
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 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.