更改部分属性值

时间:2019-09-25 12:28:53

标签: xml powershell

我想使用Powershell更改web.config文件中连接字符串的一部分。

我可以使用以下代码读取所需的连接字符串:

[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 个答案:

答案 0 :(得分:1)

这是一个自包含的示例,该示例使用-replace operator替换连接字符串中的数据库名称:

有关下面与-regex一起使用的正则表达式的说明,请参见https://regex101.com/r/Va3XN7/1-请注意,该表达式是否起作用取决于您浏览器的JavaScript引擎;例如,它可以在Chrome浏览器中使用,但可能无法在Firefox中使用。 PowerShell使用.NET regular expressions,在这种情况下,其行为与(现代)JavaScript相同。

注意:

  • 正如Ansgar Wiechers在评论中指出的那样, 点符号 可以钻入XML文档(例如$XmlDoc.configuration.connectionStrings.add.connectionString[0])< strong>方便,但有局限性:它不适合对XML文档进行结构化更改。

    • 要执行结构更改,必须直接使用基础System.Xml.XmlNode [派生]类型的方法。
  • 但是,用于简单的,非结构性更改(包括这种情况),可以使用点符号 进行更新,即:

    • 更改叶子元素的文本内容。
    • 更改属性(在层次结构中的任意位置)的值-在这种情况下。
  • 带有点符号的一般陷阱是可能与基础类型的成员发生名称冲突-请参见this answer

# 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>

答案 1 :(得分:0)

您可以使用-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(" ", "")

类似的事情