Potrzebuję uzyskać rozmiar katalogu, rekursywnie. Muszę to robić co miesiąc, więc chcę zrobić skrypt o tym numerze: PowerShell.Skrypt PowerShell, aby uzyskać pełny rozmiar katalogu
Jak mogę to zrobić?
Potrzebuję uzyskać rozmiar katalogu, rekursywnie. Muszę to robić co miesiąc, więc chcę zrobić skrypt o tym numerze: PowerShell.Skrypt PowerShell, aby uzyskać pełny rozmiar katalogu
Jak mogę to zrobić?
Wypróbuj następujące
function Get-DirectorySize() {
param ([string]$root = $(resolve-path .))
gci -re $root |
?{ -not $_.PSIsContainer } |
measure-object -sum -property Length
}
To rzeczywiście daje trochę obiektu zbiorczego który obejmie ilość elementów. Można po prostu chwycić właściwość Sum choć i to będzie suma długości
$sum = (Get-DirectorySize "Some\File\Path").Sum
EDIT Dlaczego to działa?
Złam to przez komponenty rurociągu. Polecenie gci -re $root
spowoduje, że wszystkie elementy z początkowego katalogu będą rekursywnie uruchamiane, a następnie wprowadzane do potoku. Tak więc każdy pojedynczy plik i katalog pod $root
przejdzie przez drugie wyrażenie ?{ -not $_.PSIsContainer }
. Każdy plik/katalog przekazany do tego wyrażenia można uzyskać poprzez zmienną $_
. Poprzednie? wskazuje, że jest to wyrażenie filtru, oznaczające zachowanie tylko wartości w potoku, które spełniają ten warunek. Metoda PSIsContainer zwróci wartość true dla katalogów. W efekcie wyrażenie filtru zachowuje tylko wartości plików. Ostateczny cmdlet measure-object zsumuje wartość właściwości Length dla wszystkich wartości pozostałych w potoku. Więc zasadniczo nazywa się Fileinfo.Length dla wszystkich plików w bieżącym katalogu (rekursywnie) i sumuje wartości.
Jeśli interesuje Cię rozmiar plików ukrytych i systemowych, powinieneś użyć parametru -force z Get-ChildItem.
Oto szybki sposób na wielkość poszczególnych rozszerzeń plików:
(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum
Dzięki tym, którzy napisali tutaj. Przyjąłem wiedzę, aby to zrobić:
# 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
Nice. (Get-DirectorySize "Some \ File \ Path") .Suma/1mb lub (Get-DirectorySize "Some \ File \ Path"). Suma/1GB do konwersji na megs lub koncerty. – aphoria
Czy możesz wyjaśnić, jak to działa? –
@Gauenwolf, dodano edycję dla wyjaśnienia – JaredPar