Benutzer mit den meisten Antworten
Powershell Skript zum durchsuchen von Fileshares über UNC-Pfade schmiert ab

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 }
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
- Bearbeitet Raimund AndréeMicrosoft employee Donnerstag, 22. August 2013 13:05
- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 6. September 2013 09:14
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! -
Das macht es mir fast unmöglich dir zu helfen :-(
Ich tippe mal das es der Pfad zu lang Fehler ist: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
-
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 }
-
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
- Bearbeitet Raimund AndréeMicrosoft employee Donnerstag, 22. August 2013 13:05
- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 6. September 2013 09:14
-
Hallo Mamonga,
ist die Thematik geklärt? Wenn ja - bitte markiere die entsprechenden Beiträge "als Antwort".
Viele Grüße,
AlexAlex Pitulice, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.