Как обновить строку подключения к источнику данных с помощью PowerShell в файле XML - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь автоматизировать обновление источника данных в файле web.config новыми значениями с помощью PowerShell.

Вот моя строка подключения:

<connectionStrings>
    <add name="abcLogging" connectionString="Data Source=(local)\abc; Trusted_Connection=True; Persist Security Info=True; Enlist=true; Initial Catalog=abcLogDB" providerName="System.Data.SqlClient" />
</connectionStrings>

Сценарий PowerShell:

$newstring = '"Data Source=(test)\abc; Trusted_Connection=True; Persist Security Info=True; Enlist=true; Initial Catalog=abcLogDB" '
$oldstring = '"Data Source=(local)\abc; Trusted_Connection=True; Persist Security Info=True; Enlist=true; Initial Catalog=abcLogDB" '
$XmlDocument = [xml](Get-Content "D:\abc\Web.config");
$value = $XmlDocument.configuration.connectionStrings.add.connectionstring 
$value = $value -replace "$oldstring","$newstring" | Set-Content -PassThru 

Я получил следующую ошибку при запуске вышеуказанного скрипта.

The regular expression pattern "Data Source=(local)\abc; Trusted_Connection=True;
Persist Security Info=True; Enlist=true; Initial Catalog=abcLogDB"  is not valid.
At line:5 char:1
+ $value = $value -replace "$oldstring","$newstring" | Set-Content -Pas ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: ("Data Source=(l...og=OnityLogDB" :String) [], RuntimeException
    + FullyQualifiedErrorId : InvalidRegularExpression

1 Ответ

0 голосов
/ 29 апреля 2019

Добро пожаловать в StackOverflow, Хари Кришна!С вашим сценарием происходит несколько вещей.

  1. В ваших старых и новых строках слишком много кавычек - старая строка не будет найдена.Как правило, следует использовать одинарные кавычки, если только нет встроенного $variableName, который должен быть расширен значением.

  2. Скобки обрабатываются как специальные символы регулярного выражения, так как вы используете синтаксис -replace.Метод .Replace объекта [string] можно использовать для простой замены без регулярного выражения.

  3. Команда Set-Content не знает, с каким файлом действовать.Но на самом деле вы не хотите устанавливать содержимое файла равным $value.Это даст вам файл без содержимого XML и только строки подключения.

Вот скрипт, который должен делать то, что вы хотите:

$configFile = 'C:\temp\web.config'

Set-Content -Path $configFile -Value @"
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
    <add name="abcLogging" connectionString="Data Source=(local)\abc; Trusted_Connection=True; Persist Security Info=True; Enlist=true; Initial Catalog=abcLogDB" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
"@

$newstring = 'Data Source=(test)\abc; Trusted_Connection=True; Persist Security Info=True; Enlist=true; Initial Catalog=abcLogDB'
$oldstring = 'Data Source=(local)\abc; Trusted_Connection=True; Persist Security Info=True; Enlist=true; Initial Catalog=abcLogDB'

$XmlDocument = [xml](Get-Content $configFile);
$XmlDocument.configuration.connectionStrings.add | %{
    If($_.connectionString -eq $oldstring){
        $_.connectionString = $newstring
    }
}
$XmlDocument.Save($configFile)
Get-Content -Path $configFile

EDIT: исправлены проблемы, обнаруженные в ходе дополнительного тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...