du in PowerShell?
-
22-08-2019 - |
Domanda
Come posso ottenere un du analisi -ish utilizzando PowerShell? Mi piacerebbe verificare periodicamente la dimensione delle cartelle sul mio disco.
Di seguito mi dà la dimensione di ogni file nella directory corrente:
foreach ($o in gci)
{
Write-output $o.Length
}
Ma quello che voglio davvero è la dimensione aggregata di tutti i file nella directory, comprese le sottodirectory. Inoltre mi piacerebbe essere in grado di risolvere la questione in base alle dimensioni, opzionalmente.
Soluzione
C'è un'implementazione disponibile al blog "Exploring Belle Lingue":
"L'attuazione del 'du -s *' 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}
}
(Codice dal proprietario del blog: Luis Diego Fallas)
Output:
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
Altri suggerimenti
ho modificato il comando nella risposta un po 'per ordinare decrescente per dimensione e comprendono dimensione 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
Output:
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
: Forse non è il metodo più efficiente, ma funziona.
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 }
}
}
Il mio è un po 'diverso; I gruppo tutti i file sul NomeDirectory, poi a piedi attraverso quella totali costruzione della lista per ogni directory (per includere le sottodirectory).