du in Powershell?
-
22-08-2019 - |
Frage
Wie kann ich eine ich -ish Analyse unter Verwendung von Powershell? Ich möchte regelmäßig die Größe der Verzeichnisse auf meiner Festplatte überprüfen.
Im Folgenden gibt mir die Größe der einzelnen Dateien im aktuellen Verzeichnis:
foreach ($o in gci)
{
Write-output $o.Length
}
Aber was ich wirklich will, ist die Gesamtgröße aller Dateien im Verzeichnis, einschließlich Verzeichnisse. Ich würde auch gerne in der Lage sein, um es nach Größe zu sortieren, optional.
Lösung
Es gibt eine verfügbare Implementierung auf dem „Exploring Schöner Sprachen“ Blog:
"Eine Implementierung von‚ich ihm *‘in Powershell"
function directory-summary($dir=".") {
get-childitem $dir |
% { $f = $_ ;
get-childitem -r $_.FullName |
measure-object -property length -sum |
select @{Name="Name";Expression={$f}},Sum}
}
(-Code durch den Blog-Eigentümer: Luis Diego Fallas)
Ausgabe:
PS C:\Python25> directory-summary Name Sum ---- --- DLLs 4794012 Doc 4160038 include 382592 Lib 13752327 libs 948600 tcl 3248808 Tools 547784 LICENSE.txt 13817 NEWS.txt 88573 python.exe 24064 pythonw.exe 24576 README.txt 56691 w9xpopen.exe 4608
Andere Tipps
ich den Befehl in der Antwort etwas nach Größe absteigend sortiert werden geändert und ist Größe in MB:
gci . |
%{$f=$_; gci -r $_.FullName |
measure-object -property length -sum |
select @{Name="Name"; Expression={$f}},
@{Name="Sum (MB)";
Expression={"{0:N3}" -f ($_.sum / 1MB) }}, Sum } |
sort Sum -desc |
format-table -Property Name,"Sum (MB)", Sum -autosize
Ausgabe:
PS C:\scripts> du
Name Sum (MB) Sum
---- -------- ---
results 101.297 106217913
SysinternalsSuite 56.081 58805079
ALUC 25.473 26710018
dir 11.812 12385690
dir2 3.168 3322298
Vielleicht ist es nicht die effizienteste Methode, aber es funktioniert.
function Get-DiskUsage ([string]$path=".") {
$groupedList = Get-ChildItem -Recurse -File $path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } }
foreach ($dn in $groupedList) {
New-Object psobject -Property @{ directoryName=$dn.name; length=($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum }
}
}
Ich ist ein bisschen anders; I-Gruppe alle Dateien auf Verzeichnisname, dann zu Fuß durch die genannte Liste Gebäude Summen für jedes Verzeichnis (um die Unterverzeichnisse enthalten).