我想使用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
我现在如何更改该值并将其保存到文件中?
答案 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(" ", "")
类似的事情