如何使用PowerShell在文件中替换多个字符串
如何使用PowerShell在文件中替换多个字符串
我正在编写一个脚本,用于自定义配置文件。我想替换文件中多个字符串的实例,并尝试使用PowerShell来完成任务。
对于单个替换,它可以很好地工作,但进行多个替换非常慢,因为每次都需要再次解析整个文件,而该文件非常大。脚本如下:
$original_file = 'path\filename.abc' $destination_file = 'path\filename.abc.new' (Get-Content $original_file) | Foreach-Object { $_ -replace 'something1', 'something1new' } | Set-Content $destination_file
我想要这样的东西,但我不知道如何编写:
$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
admin 更改状态以发布 2023年5月20日
如果您想要让George Howarth的文章在进行多次替换时正常工作,您需要删除break语句,并将输出分配给一个变量($line),然后输出该变量:
$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
一种方法是将-replace
操作链接在一起。每行末尾的`
转义换行符,导致PowerShell在下一行继续解析表达式:
$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
另一种方法是分配一个中间变量:
$x = $_ -replace 'something1', 'something1aa' $x = $x -replace 'something2', 'something2bb' ... $x