Powershell递归查找和替换脚本

时间:2016-04-27 00:55:28

标签: powershell recursion replace find powershell-v2.0

我一直在使用powershell来完成一个递归查找并替换一个文件夹,然后该文件夹将完成查找文件夹和子文件夹中所有文件的替换。找到并替换了大约1500个不同的值。

我目前的代码适用于少量文件,但我需要在4GB文件夹上运行,该文件夹使用服务器上的所有内存(16GB RAM)并导致PowerShell崩溃。

下面的代码显然效率不高,所以有人知道更有效的方法来完成上述任务。如果不是,任何人都不知道我可以用来完成这项任务的不同编程语言。请记住,我只有一个可以使用的Windows 2012服务器。

$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
}

1 个答案:

答案 0 :(得分:0)

未经测试,但我认为这可能会更好:

$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
}