PowerShell найти и заменить регулярным выражением в поведении файла - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь найти и заменить строку подключения на PowerShell.Вот регулярное выражение: https://regex101.com/r/onyJZz/1 найти то, что мне нужно.

Содержимое файла конфигурации, который я хочу изменить, выглядит следующим образом:

<connectionStrings>
  <add name="FrameworkEntities" connectionString="metadata=res://*/PortalEntities.csdl|res://*/PortalEntities.ssdl|res://*/PortalEntities.msl;provider=System.Data.SqlClient;
       provider connection string=&quot;data source=someservername.domain.co;initial catalog=Portal;persist security info=True;user 
id=user;password=user$ecurity;MultipleActiveResultSets=True;App=EntityFramework;" providerName="System.Data.EntityClient" />
</connectionStrings>

В основном необходимо заменить все значение строки подключения.Вот суть того, что я делаю

$regex = '(?<=\bconnectionString=")[^"]*'
$dbname = 'newserver.domain.co' 
$user = 'sa'
$password = 'password2'
$catalog = 'Portal'
$frameworkdbpath = 'c:\folder\db.config'

$finalString = "metadata=res://*/PortalEntities.csdl|res://*/PortalEntities.ssdl|res://*/PortalEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=$dbname;initial catalog=$catalog;persist security info=True;user id=$user;password=$password;MultipleActiveResultSets=True;App=EntityFramework;"

(Get-Content $frameworkdbpath) | ForEach-Object {
    $_ -replace $regex, $finalString
} | Set-Content $frameworkdbpath

При запуске приведенного выше кода замена работает только до первой точки с запятой.Остальная часть строки остается, и я не знаю почему.

1 Ответ

0 голосов
/ 17 декабря 2018

Строка подключения заключена в несколько строк.Get-Content возвращает содержимое в виде массива строк, каждая из которых обрабатывается отдельно.Из-за этого вторая и третья строки вашей строки подключения не соответствуют вашему выражению.

Плохое решение: Считайте файл в одну строку перед применением регулярного выражения.Вы также можете удалить ForEach-Object.

(Get-Content $frameworkdbpath -Raw) -replace $regex, $finalString |
    Set-Content $frameworkdbpath

Хорошее решение: Ваши входные данные в формате XML, поэтому они должны обрабатываться как таковые.

[xml]$xml = Get-Content $frameworkdbpath
$node = $xml.SelectSingleNode('/connectionStrings/add')
$node.connectionString = $finalString
$xml.Save($frameworkdbpath)
...