Изменить часть значения атрибута - PullRequest
1 голос
/ 25 сентября 2019

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

Я могу прочитать нужную строку подключения с помощью следующего кода:

[xml]$XmlDoc = Get-Content C:\...\Web.config
$ConString = $XmlDoc.configuration.connectionStrings.add.connectionString[0]

иполучите правильное извлеченное значение:

server=testDB01\sql14;uid=abc;pwd=def;database=ghi;language=english

Теперь я хочу изменить части после "=", чтобы адаптировать значения по мере необходимости.Я могу получить доступ к значениям, разделив текст на части, например,

$ConString.Split(";")[0].Split("\")[1]

, который возвращает

sql14

Как теперь я могу изменить это значение и сохранить его в файл?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Вот автономный пример, который использует оператор -replace для замены имени базы данных в строке подключения:

Примечание:

  • Как указывает Ансгар Вихерс в комментарии, точечная запись для детализации XML-документа (например, $XmlDoc.configuration.connectionStrings.add.connectionString[0]) удобна,но имеет ограничения : он не подходит для внесения структурных изменений в документы XML.

    • Для выполнения структурных изменений необходимо работать напрямуюс методами базовых System.Xml.XmlNode [- производных] типов.
  • Однако для простых, неструктурных изменений (включая этот случай), точечная запись может использоваться для обновления , а именно:

    • Изменение текстового содержимого листа element.
    • Изменение значения атрибута (в любом месте иерархии) - как в этом случае.
  • ГПодводная черта с точечной нотацией - это возможность столкновения имен с членами базовых типов - см. этот ответ .

# Create a sample XML file.
@'
<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <add>
            <connectionString server="server=testDB01\sql14;uid=abc;pwd=def;database=ghi;language=english" />
            <connectionString server="..." />
        </add>
    </connectionStrings>
</configuration>
'@ > test.xml

# Read the file into an XML document.
[xml] $xmlDoc = Get-Content -Raw test.xml

# Update the 'server' attribute of the first <connectionString> element:
# Replace the existing db name with 'sql999'
$element = $xmlDoc.configuration.connectionStrings.add.connectionString[0]
$element.server = $element.server -replace '(?<=\bserver=.+?\\).+?(?=;)', 'sql999'

# Save the modified document back to the file.
# Note: This uses BOM-less UTF-8 encoding.
#       Convert-Path ensures that a full path is passed to the .Save() method,
#       because .NET's current directory typically differ from PowerShell's
$xmlDoc.Save((Convert-Path test.xml))

# Output the updated content:
Get-Content test.xml

Выше приведено следующее:обратите внимание, как sql14 был заменен на sql999:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add>
      <connectionString server="server=testDB01\sql999;uid=abc;pwd=def;database=ghi;language=english" />
      <connectionString server="..." />
    </add>
  </connectionStrings>
</configuration>
0 голосов
/ 25 сентября 2019

Вы можете использовать -Join для объединения строк обратно:

$ConString = "server=testDB01\sql14;uid=abc;pwd=def;database=ghi;language=english"
$values1 = $ConString.Split(";")
$values = $values1[0].Split("\")

$values[1] = "foo"

$values = -Join $values, "\"
$values1[0] = $values

$ConString = -Join $values1,";"

Write-Host $ConString.Replace(" ", "")

Что-то вроде этих строк

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