PowerShell在文件行为中查找并替换为正则表达式

时间:2018-12-16 22:11:09

标签: regex powershell powershell-v4.0

我正在尝试使用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 :(得分:4)

您的连接字符串包含在多行中。 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)