Как заменить строку между 2 определенными тегами

У меня есть текстовый файл со следующим текстом в:

<ServerAddress>.</ServerAddress>
<ServerDatabase>test</ServerDatabase>
<ServerUsername>jimmy</ServerUsername>

Я хочу иметь возможность заменить».»с read-hostвведенным фрагментом текста.
Например измените его от <ServerAddress>.</ServerAddress>к

<ServerAddress>server1</ServerAddress>

Код у меня куда работает… но он заменяет все в файле на одну и ту же строку снова и снова, поэтому в примере сверху он бы заменил все на <ServerAddress>server1</ServerAddress>

Вот что у меня есть до сих пор:

pushd "C:PSFMove to V6DTT Files"
$configFiles = Get-ChildItem . *.dtt -rec
$servername = Read-Host 'What the server name?'
$regex='(m?)>[^<]+<'
foreach ($file in $configFiles)

{
(Get-Content $file.PSPath) |
Foreach-Object { "<ServerAddress>.</ServerAddress>" -replace $regex, ">$servername<" } |
Set-Content $file.PSPath
}

1 ответ

  1. Не используйте regex для замены XML-содержимого. Вместо этого загрузите файл в виде XML, выберите узел и задайте значения:

    Образец:

    [xml]$xml =
    @'
    <root>
        <ServerAddress>.</ServerAddress>
        <ServerDatabase>test</ServerDatabase>
        <ServerUsername>jimmy</ServerUsername>
    </root>
    '@
    
    $xml.DocumentElement.ServerAddress = 'newServer'
    $xml.Save('yourLocation')