How to replace multiple strings in a file using PowerShell
One option is to chain the -replace
operations together. The `
at the end of each line escapes the newline, causing PowerShell to continue parsing the expression on the next line:
$original_file = 'path\filename.abc'$destination_file = 'path\filename.abc.new'(Get-Content $original_file) | Foreach-Object { $_ -replace 'something1', 'something1aa' ` -replace 'something2', 'something2bb' ` -replace 'something3', 'something3cc' ` -replace 'something4', 'something4dd' ` -replace 'something5', 'something5dsf' ` -replace 'something6', 'something6dfsfds' } | Set-Content $destination_file
Another option would be to assign an intermediate variable:
$x = $_ -replace 'something1', 'something1aa'$x = $x -replace 'something2', 'something2bb'...$x
To get the post by George Howarth working properly with more than one replacement you need to remove the break, assign the output to a variable ($line) and then output the variable:
$lookupTable = @{ 'something1' = 'something1aa' 'something2' = 'something2bb' 'something3' = 'something3cc' 'something4' = 'something4dd' 'something5' = 'something5dsf' 'something6' = 'something6dfsfds'}$original_file = 'path\filename.abc'$destination_file = 'path\filename.abc.new'Get-Content -Path $original_file | ForEach-Object { $line = $_ $lookupTable.GetEnumerator() | ForEach-Object { if ($line -match $_.Key) { $line = $line -replace $_.Key, $_.Value } } $line} | Set-Content -Path $destination_file
With version 3 of PowerShell you can chain the replace calls together:
(Get-Content $sourceFile) | ForEach-Object { $_.replace('something1', 'something1').replace('somethingElse1', 'somethingElse2') } | Set-Content $destinationFile