none
Ermitteln von Ordner Größen RRS feed

  • Frage

  • Hallo,

    ich nutze ein Script zur Ermittlung von Ordner Größen auf einem entfernten Fileserver.
    Der Zugriff erfolgt über den UNC-Pfad.

    $objFSO = New-Object -com  Scripting.FileSystemObject
    $OrdnerGroesseBelegt = objFSO.GetFolder($UnterOrdner.FullName).Size

    Die Ermittlung funktioniert bei 99% der Ordner perfekt.
    Bei einigen gibt mit der Befehl keinen Wert zurück, obwohl ich vollen Zugriff auf den entsprechenden Ordner habe.

    Hat jemand ähnliche Erfahrungen gemacht, oder kennt die Lösung für dieses Problem?

    Mittwoch, 26. September 2012 13:39

Antworten

  • Das Script http://poshcode.org/1185 ünterdrückt einfach alle Fehlermeldungen:

    Get-ChildItem $path -Force -ea SilentlyContinue

    Deshalb scheint es nur zu funktionieren!
    Bei solchen operation hast du normalerweise auch meistens probleme mit den zugriffsrechten, diese werden damit auch weggeschluckt!

    Bei langen Dateipfaden MUSST du leider ausserhalb von PowerShell Arbeiten.

    Du kannst RoboCopy.Exe dazu benutzen dies hat keine Problem meit langen pfaden (Robocopy ist seit Win Vista auf dem system annsonsten downloaden):

    $Ordner = 'c:\program files'
    
    # Robocopy zum ermitteln von Dateiordner Grössen mit langen Dateipfaden
    # Dieser Befehl nutzt RoboCopy.exe im Virtuellen modus /l (die Aktionen werden nur im Speicher nicht im Dateisystem ausgeführt)
    # Aus der Textanzeige von RoboCopy wird mittels Textverarbeitung die Ordnergrösse in Bytes herausgelesen.
    # Das Ziel $env:Temp ist nur ein "Dummy" der nicht benutzt wird, da alles im Speicher abläuft.
    (robocopy.exe $Ordner $env:Temp /zb /e /l /r:1 /w:1 /nfl /ndl /nc /fp /bytes /np /njh) | Where-Object {$_ -like "*Bytes*"} | ForEach-Object { (-split $_)[1] }

    Siehe hier:
    http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/30efc904-0aea-454e-a8d0-60408258126e/

    Robocopy ist sehr schnell ;-))


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '



    • Bearbeitet Peter Kriegel Donnerstag, 27. September 2012 11:09
    • Als Antwort markiert Sizco Montag, 1. Oktober 2012 09:44
    Donnerstag, 27. September 2012 11:06

Alle Antworten

  • Sind das Systemordner? Andere Besonderheiten? Irgend eine Fehlermeldung ?

    Kannst du mit der obigen Methode lokal auf dem Server die Größe der Problemverzeichnisse auslesen?

    Falls nicht, teste mal alternativ diese Methode (lokal) um ggfls einen Fehler zu bekommen:

     

     ((Get-ChildItem $Ordner -recurse -force -ErrorAction Stop  | select Length  | Measure-Object -Sum length).sum / 1MB)
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 26. September 2012 17:46
    Moderator
  • Das sind ganz normale Ablage-Ordner ohne irgendwelche Besonderheiten.
    Da diese Ablagen auf einer NetApp liegen, kann ich lokal keine Scripte ausführen.

    Bei deinem Script erhalte ich folgende Fehlermeldung:

    Get-ChildItem : Der angegebene Pfad und/oder Dateiname ist zu lang. Der vollständig qualifizierte Dateiname muss kürzer als 260 Zeichen und der Pfadname kürzer als 248 Zeichen sein.

    Scheinbar bricht er aufgrund dieses Problems ab und gibt nichts zurück.


    • Bearbeitet Sizco Donnerstag, 27. September 2012 06:30
    Donnerstag, 27. September 2012 06:29
  • Hallo Sizco !

    Du vermischst hier zwei Techiken COM- Windows Scripting Host und PowerShell das kann natürlich zu ungewünschten seiten effekten führen.
    Unteranderem bekommst du dann auch eventuell keine vernünftigen Fehlermeldungen!

    Es gibt genügend reine PowerShell Script Lösungen um auch mit PowerShell die Ordnergrösse zu ermitteln.: http://poshcode.org/1185

    oder hier mit ausgabe Anzahl der Dateien usw.:
    http://gallery.technet.microsoft.com/scriptcenter/Outputs-directory-size-964d07ff

    Zu deinem Problem vermute ich das die Dateipfade zu lang werden! Dies passiert gerade bei FileShares sehr schnell, da die User mit kurzen pfaden über eine Freigabe zugreifen und der Administrator die langen pfade über die Laufwerkswurzel gehen.
    Windows unterstützt nur Dateipfade bis 260 Zeichen!
    Du kanst dies mit folgender Zeile testen:

    Get-ChildItem $Ordner -Recurse | ForEach-Object { $_.fullname.length -gt 240} | Select-Object FullName 2>&1>> 'c:\temp\PathTooLong.txt'

    In der Datei c:\temp\PathTooLong.txt stehen dann die Pfade die zu lang sind.

    Siehe:

    http://social.technet.microsoft.com/wiki/contents/articles/12179.net-powershell-path-too-long-exception-and-a-net-powershell-robocopy-clone-en-us.aspx





    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Donnerstag, 27. September 2012 06:38
  • Hallo,

    danke für die Antwort.
    Mit Hilfe deines Befehls konnte ich ermitteln, dass bei 58 Dateien der Pfad zu lang ist.

    Jetzt bin ich auf der Suche nach einer Lösung für dieses Problem.
    Ich möchte ungern jeden Ordner vorher als Netzlaufwerk verbinden müssen.

    Das Script unter http://poshcode.org/1185 scheint keine Probleme mit den langen Pfaden zu haben.
    Leider werden dort zuviele Informationen ausgegeben. Ich brauche lediglich die Gesamtgröße des angegebenen Ordners.

    Donnerstag, 27. September 2012 07:41
  • >Scheinbar bricht er aufgrund dieses Problems ab und gibt nichts zurück.

    Er hat den Fehler zurückgegeben und darum gings hier. :)


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 27. September 2012 09:40
    Moderator
  • Das Script unter http://poshcode.org/1185 scheint keine Probleme mit den langen Pfaden zu haben

    Wenn das geht und die Ausführlichkeit der Ausgabe nur noch das Problem ist, dann reduziere diese doch einfach, z.b. mit select-object .

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Donnerstag, 27. September 2012 09:43
    Moderator
  • Das Script http://poshcode.org/1185 ünterdrückt einfach alle Fehlermeldungen:

    Get-ChildItem $path -Force -ea SilentlyContinue

    Deshalb scheint es nur zu funktionieren!
    Bei solchen operation hast du normalerweise auch meistens probleme mit den zugriffsrechten, diese werden damit auch weggeschluckt!

    Bei langen Dateipfaden MUSST du leider ausserhalb von PowerShell Arbeiten.

    Du kannst RoboCopy.Exe dazu benutzen dies hat keine Problem meit langen pfaden (Robocopy ist seit Win Vista auf dem system annsonsten downloaden):

    $Ordner = 'c:\program files'
    
    # Robocopy zum ermitteln von Dateiordner Grössen mit langen Dateipfaden
    # Dieser Befehl nutzt RoboCopy.exe im Virtuellen modus /l (die Aktionen werden nur im Speicher nicht im Dateisystem ausgeführt)
    # Aus der Textanzeige von RoboCopy wird mittels Textverarbeitung die Ordnergrösse in Bytes herausgelesen.
    # Das Ziel $env:Temp ist nur ein "Dummy" der nicht benutzt wird, da alles im Speicher abläuft.
    (robocopy.exe $Ordner $env:Temp /zb /e /l /r:1 /w:1 /nfl /ndl /nc /fp /bytes /np /njh) | Where-Object {$_ -like "*Bytes*"} | ForEach-Object { (-split $_)[1] }

    Siehe hier:
    http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/30efc904-0aea-454e-a8d0-60408258126e/

    Robocopy ist sehr schnell ;-))


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '



    • Bearbeitet Peter Kriegel Donnerstag, 27. September 2012 11:09
    • Als Antwort markiert Sizco Montag, 1. Oktober 2012 09:44
    Donnerstag, 27. September 2012 11:06
  • In dem Zusammenhang ist übrigens RoboPowerCopy auch sehr interessant.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 27. September 2012 11:39
    Moderator
  • Das stimmt. Es ist nur recht langsam und muss zusätzlich besorgt werden! Deshalb habe ich darauf verzichtet! (es ist ja in meinem Wiki Artikel erwähnt !)
    http://social.technet.microsoft.com/wiki/contents/articles/12179.net-powershell-path-too-long-exception-and-a-net-powershell-robocopy-clone-en-us.aspx

    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Donnerstag, 27. September 2012 13:05
  • Du kannst RoboCopy.Exe dazu benutzen dies hat keine Problem meit langen pfaden (Robocopy ist seit Win Vista auf dem system annsonsten downloaden):
    $Ordner = 'c:\program files'
    
    # Robocopy zum ermitteln von Dateiordner Grössen mit langen Dateipfaden
    # Dieser Befehl nutzt RoboCopy.exe im Virtuellen modus /l (die Aktionen werden nur im Speicher nicht im Dateisystem ausgeführt)
    # Aus der Textanzeige von RoboCopy wird mittels Textverarbeitung die Ordnergrösse in Bytes herausgelesen.
    # Das Ziel $env:Temp ist nur ein "Dummy" der nicht benutzt wird, da alles im Speicher abläuft.
    (robocopy.exe $Ordner $env:Temp /zb /e /l /r:1 /w:1 /nfl /ndl /nc /fp /bytes /np /njh) | Where-Object {$_ -like "*Bytes*"} | ForEach-Object { (-split $_)[1] }

    Siehe hier:
    http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/30efc904-0aea-454e-a8d0-60408258126e/

    Robocopy ist sehr schnell ;-))


    Vielen Dank für den Tip mit Robocopy.
    Funktioniert super und auch schnell genug.

    Montag, 1. Oktober 2012 09:44