Benutzer mit den meisten Antworten
Verzeichnisgröße ermitteln, Get-ChildItem, sort

Frage
-
Hallo ihr Powershell Gurus.
ich haben eine Code gefunden und den angepasst und hätte 3 Fragen
$RootVz = Get-ChildItem -directory c:\temp
foreach ($i in $RootVz)
{
$Groesse = (Get-ChildItem "c:\$i\AppData" -Recurse | measure -property length -Sum)
"{0:N2}" -f ($Groesse.sum/1MB) + "MB,$i"
}funktioniert so weit so gut. Wenn ich den Verzeichnisnamen vorne haben möchte geht es nicht.
"{0:N2}" -f ($Groesse.sum/1MB) + "MB,$i"
"$i","{0:N2}" -f ($Groesse.sum/1MB) + "MB" ==> Verzeichnisname am Anfang geht nicht?
2.) was bedeutet {0:N2}
3. wenn ich das Ergebnis sortieren möchte (ich habe es jetzt in Excel sortiert - möchte aber für künftig dazulernen), müsste ich vermutlich die foreach Schleife einer Variable bzw. Objekt zuweisen - oder? Wie müsste der code da aussehen, wo steht das | sort, nach was sortiere ich? length = ja nicht die Summe die mir die foreach zurückliefert? Ich hoffe ich konnte mich etwas verständlich ausdrücken
$a = foreach ($i in $RootVz)
Chris
Antworten
-
zu 1. doch - geht ...
"$i {0:N2} MB" -f ($Groesse.sum/1MB)
oder
"{1} {0:N2} MB" -f ($Groesse.sum/1MB),$i
zu 2. da schaust Du mal bitte hier: -f format operator oder hier: Using the -F Format Operator in Powershell
zu 3. Du kannst das Ergebnis an das Cmdlet 'Sort-Object' per Pipeline weiterleiten.
BTW: Es ist hilfreich, wenn Du hier Code postest, den auch als Code zu formatieren.
(und wenn eine Antwort den Knoten bei platzen lässt, kannst Du diese auch als Solche markieren. Das hilft auch anderen die das Gleiche suchen)
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Mittwoch, 16. November 2016 15:13
- Als Antwort markiert -- Chris -- Mittwoch, 16. November 2016 17:37
-
Die Powershell ist generell 'case insensitive', also bis auf wenige Ausnahmen ist die Groß-Klein-Schreibung egal. Es macht aber einen guten Stil aus, wenn man sich eine einheitliche Struktur angewöhnt. Die Pipe in Powershell ist das Symbol "|" (ohne die Gänsefüßchen). Es wird dazu benutzt den Output eines Kommandos an ein weiteres weiterzureichen um in weiterzuverarbeiten oder zu formatieren usw.
So richtig werde ich aus Deinem Code nicht schlau. Wenn ich richtig vermute, möchtest Du die Gesamtgröße der AppData-Verzeichnisse ermitteln und ausgeben. Ein bissl hübsch gemacht, kann das so aussehen:
$RootVzs = Get-Item -Path "c:\*\*\AppData" -Force | Select-Object -ExpandProperty FullName $Report = Foreach($RootVz in $RootVzs){ Get-ChildItem -Path $RootVz -Recurse -Force -File -ErrorAction SilentlyContinue -PipelineVariable Folder | Measure-Object -Property Length -Sum | Select-Object -Property @{Name='Folder';Expression={$RootVz}},@{Name='Size';Expression={$_.Sum}}
Damit hast Du erstmal die 'rohen' Daten in der Variable
$Report
Jetzt, da Du die Daten einmal in einer Variable gespeichert hast, kannst Du damit tun, was auch immer nötig ist. z.B. nach Größe sortieren:
$Report | Sort-Object -Property Size
Oder nach Größe rückwärts sortieren:
$Report | Sort-Object -Property Size -Descending
Oder die Größe in MB ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={$_.Size / 1MB}}
Oder die Größe in MB sortiert ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={$_.Size / 1MB}} | Sort-Object -Property 'Size(MB)'
Oder die Größe in MB und gerundet ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0:N2}" -f ($_.Size / 1MB)}}
Oder die Größe in MB und gerundet und net ausgerichtet ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0,10:N2}" -f ($_.Size / 1MB)}}
und jetzt das ganze auch noch sortiert:
$Report | Sort-Object -Property Size | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0,10:N2}" -f ($_.Size / 1MB)}}
so, das reicht erst mal.
Viel Spaß!
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''- Als Antwort markiert -- Chris -- Donnerstag, 17. November 2016 06:34
Alle Antworten
-
zu 1. doch - geht ...
"$i {0:N2} MB" -f ($Groesse.sum/1MB)
oder
"{1} {0:N2} MB" -f ($Groesse.sum/1MB),$i
zu 2. da schaust Du mal bitte hier: -f format operator oder hier: Using the -F Format Operator in Powershell
zu 3. Du kannst das Ergebnis an das Cmdlet 'Sort-Object' per Pipeline weiterleiten.
BTW: Es ist hilfreich, wenn Du hier Code postest, den auch als Code zu formatieren.
(und wenn eine Antwort den Knoten bei platzen lässt, kannst Du diese auch als Solche markieren. Das hilft auch anderen die das Gleiche suchen)
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Mittwoch, 16. November 2016 15:13
- Als Antwort markiert -- Chris -- Mittwoch, 16. November 2016 17:37
-
klein groß scheint bei N egal zu sein, lt. deinem Link
ich kenne derzeit Pipe meist nur bei Powershell Einzeilern >c:test.txt
hatte noch keine zeit zum testen. Du meinst vermutlich so
$RootVz = Get-ChildItem -directory c:\temp foreach ($i in $RootVz) { $Groesse = (Get-ChildItem "c:\$i\AppData" -Recurse | measure -property length -Sum) "{0:N2}" -f ($Groesse.sum/1MB) + "MB,$i" } > c:test.txt
bzw.
$RootVz = Get-ChildItem -directory c:\temp foreach ($i in $RootVz) { $Groesse = (Get-ChildItem "c:\$i\AppData" -Recurse | measure -property length -Sum) "{0:N2}" -f ($Groesse.sum/1MB) + "MB,$i" }
| out-gridview
Chris
- Bearbeitet -- Chris -- Mittwoch, 16. November 2016 18:18
-
Die Powershell ist generell 'case insensitive', also bis auf wenige Ausnahmen ist die Groß-Klein-Schreibung egal. Es macht aber einen guten Stil aus, wenn man sich eine einheitliche Struktur angewöhnt. Die Pipe in Powershell ist das Symbol "|" (ohne die Gänsefüßchen). Es wird dazu benutzt den Output eines Kommandos an ein weiteres weiterzureichen um in weiterzuverarbeiten oder zu formatieren usw.
So richtig werde ich aus Deinem Code nicht schlau. Wenn ich richtig vermute, möchtest Du die Gesamtgröße der AppData-Verzeichnisse ermitteln und ausgeben. Ein bissl hübsch gemacht, kann das so aussehen:
$RootVzs = Get-Item -Path "c:\*\*\AppData" -Force | Select-Object -ExpandProperty FullName $Report = Foreach($RootVz in $RootVzs){ Get-ChildItem -Path $RootVz -Recurse -Force -File -ErrorAction SilentlyContinue -PipelineVariable Folder | Measure-Object -Property Length -Sum | Select-Object -Property @{Name='Folder';Expression={$RootVz}},@{Name='Size';Expression={$_.Sum}}
Damit hast Du erstmal die 'rohen' Daten in der Variable
$Report
Jetzt, da Du die Daten einmal in einer Variable gespeichert hast, kannst Du damit tun, was auch immer nötig ist. z.B. nach Größe sortieren:
$Report | Sort-Object -Property Size
Oder nach Größe rückwärts sortieren:
$Report | Sort-Object -Property Size -Descending
Oder die Größe in MB ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={$_.Size / 1MB}}
Oder die Größe in MB sortiert ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={$_.Size / 1MB}} | Sort-Object -Property 'Size(MB)'
Oder die Größe in MB und gerundet ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0:N2}" -f ($_.Size / 1MB)}}
Oder die Größe in MB und gerundet und net ausgerichtet ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0,10:N2}" -f ($_.Size / 1MB)}}
und jetzt das ganze auch noch sortiert:
$Report | Sort-Object -Property Size | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0,10:N2}" -f ($_.Size / 1MB)}}
so, das reicht erst mal.
Viel Spaß!
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''- Als Antwort markiert -- Chris -- Donnerstag, 17. November 2016 06:34
-
Die Powershell ist generell 'case insensitive', also bis auf wenige Ausnahmen ist die Groß-Klein-Schreibung egal. Es macht aber einen guten Stil aus, wenn man sich eine einheitliche Struktur angewöhnt. Die Pipe in Powershell ist das Symbol "|" (ohne die Gänsefüßchen). Es wird dazu benutzt den Output eines Kommandos an ein weiteres weiterzureichen um in weiterzuverarbeiten oder zu formatieren usw.
So richtig werde ich aus Deinem Code nicht schlau. Wenn ich richtig vermute, möchtest Du die Gesamtgröße der AppData-Verzeichnisse ermitteln und ausgeben. Ein bissl hübsch gemacht, kann das so aussehen:
$RootVzs = Get-Item -Path "c:\*\*\AppData" -Force | Select-Object -ExpandProperty FullName $Report = Foreach($RootVz in $RootVzs){ Get-ChildItem -Path $RootVz -Recurse -Force -File -ErrorAction SilentlyContinue -PipelineVariable Folder | Measure-Object -Property Length -Sum | Select-Object -Property @{Name='Folder';Expression={$RootVz}},@{Name='Size';Expression={$_.Sum}}
Damit hast Du erstmal die 'rohen' Daten in der Variable
$Report
Jetzt, da Du die Daten einmal in einer Variable gespeichert hast, kannst Du damit tun, was auch immer nötig ist. z.B. nach Größe sortieren:
$Report | Sort-Object -Property Size
Oder nach Größe rückwärts sortieren:
$Report | Sort-Object -Property Size -Descending
Oder die Größe in MB ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={$_.Size / 1MB}}
Oder die Größe in MB sortiert ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={$_.Size / 1MB}} | Sort-Object -Property 'Size(MB)'
Oder die Größe in MB und gerundet ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0:N2}" -f ($_.Size / 1MB)}}
Oder die Größe in MB und gerundet und net ausgerichtet ausgeben:
$Report | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0,10:N2}" -f ($_.Size / 1MB)}}
und jetzt das ganze auch noch sortiert:
$Report | Sort-Object -Property Size | Select-Object -Property Folder,@{Name='Size(MB)';Expression={"{0,10:N2}" -f ($_.Size / 1MB)}}
so, das reicht erst mal.
Viel Spaß!
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''Ich weiß die Frage ist nicht gerade von gestern, aber ich möchte an dieser Stelle mal ansetzen ich stehe nämlich gerade vor einem ähnlichen Problem.
Ich habe mir den Befehl mal kopiert und kann ich auch soweit rekonstruieren, allerdings möchte ich offensichtlich eine leicht andere Auflistung haben als der Thredersteller, mich würden nämlich nur die Größen der jeweiligen Ordner interessieren, um einen einfachen Ordner zu nehmen in dem selten viele Unterordner drin sind habe ich mir mal den Downloads Ordner geschnappt und habe den Befehl entsprechend angepasst und die in deinem Code fehlende abschließende } ergänzt. Aber ich möchte nur die Ordner der obersten Ebene haben. Als Beispiel folgende Struktur
- Ordner1 -> Ordner 1.1, 1.2, 1.3
- Ordner2 -> Ordner 2.1, 2.2, 2.3
- Ordner3 -> Ordner 3.1, 3.2, 3.3
Die Ausgabe sollte dann also so aussehen:
C:/Users/Benutzername/Downloads/Ordner1 7,35GB
C:/Users/Benutzername/Downloads/Ordner2 512KB
C:/Users/Benutzername/Downloads/Ordner3 804M
ich komme aber nicht so recht darauf, wo ich die Abfrage einfügen soll, dass erst die Ordner durchsucht werden sollen nach Unterordner und dann quasi im Anschluss die Ordner alle nach Datein, sprich es müssten vermutlich 2 Foreach Abfragen her oder?
Aber damit kam ich leider überhaupt nicht zum Ziel logischerweise müsste ich ja
Get-ChildItem -Path $RootVz -Recurse -file -ErrorAction SilentlyContinue -PipelineVariable Folder
abändern von -file auf -dir, allerdings muss ich dann bevor es an die Analyse geht, wie groß das jeweilige Element ist da ja der Ordner an sich nicht die Größeninformation mitbringt, noch anfügen, dass nun wie oben alle Elemente aufgesucht werden und dann wie zuvor auch zusammen gerechnet werden und ausgegeben werden.
Vielleicht hat sich ja inzwischen bisschen was geändert bis zur Powershell Version 6 und ich muss irgendetwas anders schreiben.
Ich bedanke mich schon mal für die Hilfe
- Bearbeitet senoyches Mittwoch, 11. Dezember 2019 20:06 Informationen ergänzt
-
Bitte keine alten, bereits als "beantwortet" markierte Threads für eigene Fragen okkupieren! Wenn Du eine Frage hast, solltest Du einen eigenen Thread erstellen und falls nötig, diesen hier einfach als Link referenzieren.
Ich werde aus Deiner Beschreibung nicht ganz schlau ... wenn ich Dich richtig verstanden habe, könnte diese Funktion etwas für Dich sein ... https://github.com/BOfH-666/Get-FolderInfo
Das Beispiel 3 der enthaltenen Hilfe könnte für Deine Aufgabenstellung passen, denke ich.
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''