none
Verzeichnisgröße ermitteln, Get-ChildItem, sort RRS feed

  • 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

    Mittwoch, 16. November 2016 14:09

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
    Mittwoch, 16. November 2016 15:02
  • 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
    Mittwoch, 16. November 2016 18:38

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
    Mittwoch, 16. November 2016 15:02
  • 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
    Mittwoch, 16. November 2016 17:46
  • 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
    Mittwoch, 16. November 2016 18:38
  • danke für die coole Tipps.

    Ich hoffe es hilft auch recht vielen anderen Usern und danke für deine Geduld.


    Chris

    Donnerstag, 17. November 2016 06:35
  • 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

    1. Ordner1 -> Ordner 1.1, 1.2, 1.3
    2. Ordner2 -> Ordner 2.1, 2.2, 2.3
    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
    Mittwoch, 11. Dezember 2019 19:50
  • 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''

    Mittwoch, 11. Dezember 2019 20:30