2016-04-27 10 views
0

Ich habe Powershell verwendet, um eine rekursive Suche und Ersetzung in einem Ordner abzuschließen, der dann die Suche nach einem Ersetzungscode für alle Dateien in den Ordnern und Unterordnern vervollständigt. Es gibt ungefähr 1500 verschiedene Werte, die gefunden und ersetzt werden.Powershell rekursiv Suchen und Ersetzen von Skripten

Der aktuelle Code Ich arbeite für eine kleine Anzahl von Dateien, aber ich muss dies auf einem 4 GB-Ordner ausführen, der den gesamten Speicher auf dem Server (16 GB RAM) verwendet und zum Absturz von Powershell führt.

Der folgende Code ist offensichtlich nicht sehr effizient, so weiß jemand eine effizientere Möglichkeit, die oben genannte Aufgabe abzuschließen. Wenn nicht, weiß jemand eine andere Programmiersprache, die ich verwenden könnte, um diese Aufgabe zu erfüllen. Bitte beachten Sie, dass ich nur einen Windows 2012 Server habe, mit dem ich arbeiten kann.

$folderLocation = 'D:\folder\location' 


#### 
$files = Get-ChildItem $folderLocation * -rec 
foreach ($file in $files){ 
    write-host "Checking File " + $file.FullName 
    (get-content $file.PSPath)| 
    Foreach-Object { 
     $_ -replace "find","replace0" ` 
     -replace "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)","scrubbed_ip" ` 
     -replace "name0","FILLER0" ` 
     -replace "name1","FILLER1" ` 
     -replace "name2","FILLER2" ` 
     -replace "name3","FILLER3" ` 
     -replace "name4","FILLER4" ` 
     -replace "name5","FILLER5" ` 
     . 
     . 
     . 
     . 

     -replace "name1500","FILLER1500" ` 




    }| 
    set-content $file.PSPath 
} 

Antwort

0

Nicht getestet, aber ich denke, das ist besser funktionieren könnte:

$folderLocation = 'D:\folder\location' 
$tempfile = 'D:\folder\location\tempfile.tmp' 


#### 
$files = Get-ChildItem $folderLocation * -rec 
foreach ($file in $files){ 
    write-host "Checking File " + $file.FullName 
    (get-content $file.PSPath -ReadCount 3000)| 
    Foreach-Object { 
     $_ -replace "find","replace0" ` 
     -replace "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)","scrubbed_ip" ` 
     -replace 'name(\d+)','FILLER$1' | 
     add-content $tempfile 
     } 
    Remove-Item $file 
    Rename-Item $tempfile -NewName $file.name 
    Remove-Item $tempfile 
} 
+0

Dank Mjolinor, führt dieser Code aber Powershell mit dem Fehler stirbt: Prozess wird beendet, aufgrund eines StackOverflowExecption. Ich möchte nur darauf hinweisen, dass im unten stehenden Code der Name 01/02/03 nur als Beispiel diente, Name könnte alles sein. Füller wird immer iterieren. -replace 'Name (\ d +)', 'FILLER $ 1' – CassOwary

+0

Haben Sie etwas in der Ausgabedatei erhalten, bevor es starb? – mjolinor

+0

Ja, es hat so funktioniert wie erwartet ... durch jeden Fund laufen und ersetzen. Die Dateiausgabe ist, was erwartet wird. Der Powershell-Bildschirm und die Ereignisanzeige sind nicht sehr hilfreich, aber alles, was ich bekomme, ist, dass der Prozess aufgrund einer StackOverflowException beendet wird. – CassOwary