none
Anzeige von Dateien pro Ordner RRS feed

  • Frage


  • Hallo, ich habe folgendes Problem:
    wir setzen eine Software ein, die ihre Daten (Attachements) als File in ein Verzeichnis speichert. Leider haben wir das Problem., das ab 500.000 Dateien pro Verzeichnis die Applikation instabil wird. DIes ist auch vom Hersteller bestätigt. Die Lösung besteht darin, ab einer gewissen Dateianzahl der Applikation ein neues Verzeichnis zuzuweisen.

    Aktuell bedeutet dies, dass man manuell jedes Verzeichnis überprüfen muss, wieviele Dateien es enthält.

    Unter WIndows 7 dauert das bei einem Ordner mit ca. 500.000 Dateien ungefähr eine Minute, danach hat man die Eigenschaften mit Anzahl der Dateien und Dateigröße.

    Ich habe das nun mit folgendem Powershell-Script probiert:

    $DATASTORE = "D:\DATASTORE"
    $WARNING=450000
    $FOLDER = Get-Childitem $DATASTORE -exclude *.* -recurse

    foreach ($File in $FOLDER) {
    $ANZAHL=(Get-ChildItem -name $File ).Count
    if ($ANZAHL -gt $WARNING) {
    "Der Ordner $File hat $ANZAHL Dateien, bitte bereinigen"

    Für den Ordner mit den genannten 500.000 Dateien braucht dieses Script ca. 3 Stunden!!!

    WIe kann ich mir ein Script machen, was mir einfach, aber dafür schnell die Anzahl der Dateien eines Ordners zurückliefert?

    Leider bin ich bei Powershell ein blutiger Anfänger, ich habe aber auf meine Suche bislang nichts entdecken können.
    Mittwoch, 3. August 2011 06:42

Antworten

  • >das klappt bei mir nicht

    Natürlich nicht. :) Du hattest ja auch (mehrfach) von einem Ordner mit 500.000 Dateien gesprochen. Die von dir geposteten Ausgaben, passen auch nicht zu dem Skript das du ganz oben gepostet hast, da hier schon bei 50 oder 60 Dateien empfohlen wird zu bereinigen und nicht bei 450000 wie oben angeben. Du scheinst also was geändert zu haben.

    Jetzt sieht es so aus als hättest du einen Rootordner und möchtest von dort aus in allen Ordnern inkl. Unterordnern jeweils die Dateianzahl prüfen.

    Wenn das so stimmt, geht es so am schnellsten:

    $DATASTORE = "D:\"
    
    # Anzahl der Dateien auf die jeder einzelne(!) Ordner geprüft wird
    $WARNING=450000 
    
    # Lese alle Ordner (nur die Ordner!) im Pfad $datastore		 
    $ALLFOLDERS = [System.IO.Directory]::GetDirectories($DATASTORE,"*","AllDirectories")
    
    foreach ($Folder in $ALLFOLDERS) { 
    
     # Berechne für jeden Ordner in $allfolders die Anzahl der Dateien direkt in diesem Ordner
    	$ANZAHL= ([System.IO.Directory]::GetFiles($Folder,"*","TopDirectoryOnly")).count
    	
    	if ($ANZAHL -gt $WARNING) {
    	"Der Ordner $Folder hat > $ANZAHL < Dateien, bitte bereinigen" 
    	}
    }
    

    Ach und lies doch bitte mal diesen Post.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Mittwoch, 3. August 2011 17:31
    Moderator

Alle Antworten

  • Zu deinem Code: du rufst du jedes Objekt zweimal auf, einmal bei $Folder und nochmal bei $Anzahl. Daher diese extreme Dauer. Das hier:

    $dir = "D:\"
    $ANZAHL = (gci $dir -recurse).Count
    if ($ANZAHL -gt $WARNING) { "....."}
    

    reicht völlig.

    Das folgende war in meinen Tests noch etwa 4-5 mal schneller:

    $dir = "D:\"
    $anzahl =[System.IO.Directory]::GetFiles($dir,"*","AllDirectories")
    if ($anzahl -gt $warning) { "....."}
    

     

    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, 3. August 2011 09:06
    Moderator
  • Tut mir leid,

    aber das klappt bei mir nicht:

    Mein Script liefert folgende Ausgabe:

    PS C:\Windows\System32\WindowsPowerShell\v1.0> D:\datastaore.ps1
    Der Ordner D:\DATASTORE\IDEAS hat 98 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\access_manager hat 61 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\aie hat 82 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\class hat 108 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\class_admin hat 200 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\client_unix hat 63 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\client_win hat 88 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\dpv_admin_guide hat 118 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\getting_started\base\common\common_files hat 57 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\graphics\graphicLibrary\tcvis\appearance\3d_materials hat 230 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\graphics\graphicLibrary\tcvis\ecad hat 181 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\graphics\graphicLibrary\tcvis\markup\3d_markup hat 50 Dateien, bitte bereinigen
    Der Ordner D:\DATASTORE\RC4TIER\help\graphics\graphicLibrary\teamcenter\end_user\content_management\interface hat 72 Dateien, bitte bereinigen

    Dein Script liefert mir:

    Der Ordner D:\DATASTORE\DATE.TXT D:\DATASTORE\ideas_pic.pdf D:\DATASTORE\ideas
    pic.pff D:\DATASTORE\mq_run_3920.mac D:\DATASTORE\mq_run_3920.src D:\DATASTORE
    mq_run_5880.mac D:\DATASTORE\mq_run_5880.src D:\DATASTORE\NX-IDEAS_UPDATE.LOG
    :\DATASTORE\TC8.3_UPDATE.LOG D:\DATASTORE\update-nx-ideas6.1.cmd D:\DATASTORE\
    PDATE-TC8.3.CMD D:\DATASTORE\TCII\ns_ior.txt D:\DATASTORE\TCII\TB.log D:\DATAS
    ORE\NX\z002vhde1d28a11b.syslog D:\DATASTORE\NX\z002vhded9c523f.syslog D:\DATAS ...

    Das war meines Erachtens auch der Grund, warum ich diese Schleife gemacht habe. Hm, wie komme ich nun aber weiter?

    Ich weiss ja nicht, wieviele Unterordner der Hauptordner Datastore hat, also muss ich jeden Unterordner einzeln gelistet bekommen, der für sich über dem Schwellwert liegt.

    Deshalb ist der Parameter $DIR nur der Hauptordner, von dort soll in jeden vorhandenen Unterordner gegangen werden, um zu überprüfen, wieviele Dateien es dort gibt.

    Mittwoch, 3. August 2011 15:08
  • >das klappt bei mir nicht

    Natürlich nicht. :) Du hattest ja auch (mehrfach) von einem Ordner mit 500.000 Dateien gesprochen. Die von dir geposteten Ausgaben, passen auch nicht zu dem Skript das du ganz oben gepostet hast, da hier schon bei 50 oder 60 Dateien empfohlen wird zu bereinigen und nicht bei 450000 wie oben angeben. Du scheinst also was geändert zu haben.

    Jetzt sieht es so aus als hättest du einen Rootordner und möchtest von dort aus in allen Ordnern inkl. Unterordnern jeweils die Dateianzahl prüfen.

    Wenn das so stimmt, geht es so am schnellsten:

    $DATASTORE = "D:\"
    
    # Anzahl der Dateien auf die jeder einzelne(!) Ordner geprüft wird
    $WARNING=450000 
    
    # Lese alle Ordner (nur die Ordner!) im Pfad $datastore		 
    $ALLFOLDERS = [System.IO.Directory]::GetDirectories($DATASTORE,"*","AllDirectories")
    
    foreach ($Folder in $ALLFOLDERS) { 
    
     # Berechne für jeden Ordner in $allfolders die Anzahl der Dateien direkt in diesem Ordner
    	$ANZAHL= ([System.IO.Directory]::GetFiles($Folder,"*","TopDirectoryOnly")).count
    	
    	if ($ANZAHL -gt $WARNING) {
    	"Der Ordner $Folder hat > $ANZAHL < Dateien, bitte bereinigen" 
    	}
    }
    

    Ach und lies doch bitte mal diesen Post.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Mittwoch, 3. August 2011 17:31
    Moderator
  • Hallo Denniver,

     

    danke, das wars.

    Ich wollte in meiner Antwort nicht auf der Anzahl der Dateien rumreiten, sondern nur wissen, wie in einer Schleife die Anzahl der Dateien pro Ordner schnell angezeigt wird. Tut mir leid, wenn ich da für Verwirrung gesorgt habe. Nochmals Danke für deine Hilfe!

    Gruß

    B. Wagner

    Donnerstag, 4. August 2011 06:25