我一直在使用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
}
答案 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
}