如何使用PowerShell在文件中替换多个字符串

39 浏览
0 Comments

如何使用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日
0
0 Comments

如果您想要让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

0
0 Comments

一种方法是将-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

0