none
Powershell Skript zum durchsuchen von Fileshares über UNC-Pfade schmiert ab RRS feed

  • Frage

  • Hallo,

    ich habe ein Powershell skript erstellt, dass aber leider immer mal wieder abstürzt nach einem gewissen Zeitraum. Der Zeitraum des Abbruchs ist unterschiedlich. Manchmal nach 200 gefunden Dateien ein anderes mal nach 7000 oder mal 10 000. Mein Fileshare hat mehrere 100 0000 Dokumente die durchsucht werden sollen.

    Hab ich hier ein Problem mit meinem Skript? Hier ein Auszu aus meinem Code. Ich lade alle Infos wie UNC-Pfad  / Userzugang und Suchwörter über eine Config:

    #Loggingfunktion
        $Logfile = "C:\Test\LOG_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".txt"
    function LogWrite {
        Param ([string]$logString, [string]$logLevel)
        $nowDate = Get-Date -ReadCount 0 -format dd.MM.yyyy 
        $nowTime = Get-Date -ReadCount 0 -format HH:mm:ss
        if ($logLevel -eq "EMPTY") {
            Add-content $logfile -ReadCount 0 -value "$FN $TrefferLine"
            Write-Host "$logString"
        } else {
            Add-content $logfile -value "[$logLevel][$nowDate][$nowTime] - $FN $TrefferLine"
            Write-Host "[$logLevel][$nowDate][$nowTime] - $FN $TrefferLine"
        }    
    }
    #<-------------------------------------------------------------------------------------------------------------------------------------------------------------------->
    #Add Content Funktion
        $fileName = "C:\Test\FileContent_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".csv"
        set-content  $fileName -Value "Dateipfad,Suchwörter"
    function ContentWrite {
        Param ([string]$contString, [string]$contLevel)
        if ($contLevel -eq "EMPTY") {
            Add-content $fileName -ReadCount 0 -value "$FN $TrefferLine"
            Write-Host "$contString" -foregroundcolor green
        } else {
            Add-content $fileName -value " $FN $TrefferLine"
            Write-Host "[$logLevel][$nowDate][$nowTime] - $FN $TrefferLine" -foregroundcolor green
        }    
    }
    # Aufbau der UNC Verbindungen 
    foreach ( $myDrive in $config.configuration.drives.path){
    Write-Host 'Aufbau der UNC Verbindung' zu $myDrive 
    New-PSDrive -Name w -PSProvider FileSystem -Root $myDrive -Credential $Cred
    #Angabe des Dateinamens
    Write-Host 'Erstelle Dateinamen' zu $fileName -foregroundcolor green
    # Output der Dateien, die die vorgegebenen Suchwörtern beinhalten
    Write-Host 'Suche nach Dateien mit Dateinamen' -foregroundcolor green
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | ForEach-Object { 
        $FN = $_.FullName + ", "
        $Treffer = @()
        foreach ( $word in $config.configuration.words.word){
                Get-Content $_ -ReadCount 0 | Select-String  -pattern  $Word  | ForEach-Object {
                $Treffer += $_.matches | Select-Object -ExpandProperty value
            }
        } 
        $Treffer = $Treffer |Sort-Object -Unique 
        $TrefferLine = $Treffer -join " "
        if ($Treffer.Count -gt 0) {
            "$FN $TrefferLine"
        }
        ContentWrite $FN $TrefferLine    LogWrite $FN $TrefferLine
        
       
    }  
    Remove-PSDrive -Name w 
     }

    Donnerstag, 22. August 2013 08:31

Antworten

  • ReadCount 0 ist keine gute Idee. Wenn gesetzt, liest die PowerShell den Inhalt komplett in den RAM und das könnte Deine Maschine recht schnell überlasten. Ich würde die [StreamReader Klasse http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx] empfehlen. Dies ist wesentlich schneller, als Get-Content. Get-Content mit Read-Count 1 (default) ist wegen anderem Overhead noch viel langsamer, dafür besser in der RAM Ausnutzung.

    Wie groß sind denn die Dateien im Maximum?

    Ein Array mit += zu erweitern, ist auch keine gute Idee. Wenn Du 5000 und mehr Treffer hast, dürfte das Stark verzögern. Ab 100.000 Treffer könnte es um gut 30 - 60 Minuten verzögern.

    Zusätzlich könnte PowerShell Remoting interessant sein, wenn Du die Informationen von mehreren Servern holst.


    -Raimund


    Donnerstag, 22. August 2013 13:03

Alle Antworten

  • Welcher Error wird angezeigt ? Posten bitte !
    Sind die Errors unterdrückt ? ErrorAction silentlycontinue?

    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    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' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 22. August 2013 09:13
  • Kein Error. Das skript stürzt ab. Wenn ich mache ausführen mir powershell, dann hört es irgendwann mal auf ohne eine Fehlermeldung.

    Windows Powershell ISE habe ich es auch mal ausgeführt. Irgendwann kam "Keine Rückmeldung"

    Donnerstag, 22. August 2013 10:56
  • Das macht es mir fast unmöglich dir zu helfen :-(
    Ich tippe mal das es der Pfad zu lang Fehler ist:

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

    lass dir beim abarbeiten die Länge deiner Pfade anzeigen (Property Fullname)


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    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' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Donnerstag, 22. August 2013 11:29 dsfsdfsd
    Donnerstag, 22. August 2013 11:26
  • kann es daran liegen? Wenn ja wie müsste ich das umsetzen? http://stackoverflow.com/questions/9439210/how-can-i-make-this-powershell-script-parse-large-files-faster
    Donnerstag, 22. August 2013 11:39
  • Habe es mal mit Get-count und -Readcount 0 probiert. habei ch das richtig gemacht?

    # Aufbau der UNC Verbindungen 
    foreach ( $myDrive in $config.configuration.drives.path){
    Write-Host 'Aufbau der UNC Verbindung' zu $myDrive 
    New-PSDrive -Name w -PSProvider FileSystem -Root $myDrive -Credential $Cred
    #Angabe des Dateinamens
    Write-Host 'Erstelle Dateinamen' zu $fileName -foregroundcolor green
    # Output der Dateien, die die vorgegebenen Suchwörtern beinhalten
    Write-Host 'Suche nach Dateien mit Dateinamen' -foregroundcolor green
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | ForEach-Object { 
        $FN = $_.FullName + ", "
        $Treffer = @()
        foreach ( $word in $config.configuration.words.word){
                Get-Content $_ -ReadCount 0 |  Select-String  -pattern  $Word  | ForEach-Object {
                $Treffer += $_.matches | Select-Object -ExpandProperty value
            }
        } 
        $Treffer = $Treffer |Sort-Object -Unique 
        $TrefferLine = $Treffer -join " "
        if ($Treffer.Count -gt 0) {
            "$FN $TrefferLine"
        }
        ContentWrite $FN $TrefferLine    
        LogWrite $FN $TrefferLine
        
       
    }  
    Remove-PSDrive -Name w 
     }

    Donnerstag, 22. August 2013 12:10
  • ReadCount 0 ist keine gute Idee. Wenn gesetzt, liest die PowerShell den Inhalt komplett in den RAM und das könnte Deine Maschine recht schnell überlasten. Ich würde die [StreamReader Klasse http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx] empfehlen. Dies ist wesentlich schneller, als Get-Content. Get-Content mit Read-Count 1 (default) ist wegen anderem Overhead noch viel langsamer, dafür besser in der RAM Ausnutzung.

    Wie groß sind denn die Dateien im Maximum?

    Ein Array mit += zu erweitern, ist auch keine gute Idee. Wenn Du 5000 und mehr Treffer hast, dürfte das Stark verzögern. Ab 100.000 Treffer könnte es um gut 30 - 60 Minuten verzögern.

    Zusätzlich könnte PowerShell Remoting interessant sein, wenn Du die Informationen von mehreren Servern holst.


    -Raimund


    Donnerstag, 22. August 2013 13:03