Benutzer mit den meisten Antworten
Ermitteln von Ordner Größen

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?
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
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". -
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
-
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-964d07ffZu 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:
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 06:45
-
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. -
>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". -
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".- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 27. September 2012 09:43
-
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
-
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". -
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' '
- Bearbeitet Peter Kriegel Freitag, 28. September 2012 05:54
-
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.