Как заменить несколько строк в использовании файла 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
96
задан Peter Mortensen 28 September 2017 в 22:20
поделиться

2 ответа

Один из вариантов - связать операции -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
151
ответ дан 24 November 2019 в 05:37
поделиться

Предполагая, что вы можете иметь только один 'something1' или 'something2' и т.д. на строку, вы можете использовать таблицу поиска:

$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 -replace $_.Key, $_.Value
            break
        }
    }
} | Set-Content -Path $destination_file

Если вы можете иметь более одной такой строки, просто удалите break в операторе if.

8
ответ дан 24 November 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: