NealR
NealR

Reputation: 10669

Powershell -replace regex not working on connection strings

I'm attempting to use the Powershell -replace command to update the data source in my config file. However, the -replace regex below will not remove the $oldServer value.

I've place a string directly in to the $_.connectionString variable in the loop and it saved properly, so I know that is not the issue. Seems to just be the regex.

    #environment variables
    $env = "DEV"                    
    $oldServer = "quasq10"          
    $newValue = "$env-AR-SQL.CORP.COM"

    $doc = [xml](Get-Content "D:\AMS\app.config")      
    $doc.configuration.connectionStrings.add|%{        
        $_.connectionString = $_.connectionString -replace $oldServer, $newValue;
    }
    $doc.Save($file.FullName)

EDIT

Per the comment below I added a Write-host $_.connectionString statement as the first line in the loop. Below is the console output

metadata=res:///MonetDb.csdl|res:///MonetDb.ssdl|res://*/MonetDb.msl;provider=System.Data.SqlClient;provider connection string="data source=quasq10\sql08a;initial catalog=MyDB ;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"

Upvotes: 0

Views: 512

Answers (1)

mortenya
mortenya

Reputation: 209

I just put this right into ISE, I copied your connection string into a variable and was able to do this replace as a one off.

$connectionString = 'metadata=res:///MonetDb.csdl|res:///MonetDb.ssdl|res://*/MonetDb.msl;provider=System.Data.SqlClient;provider connection string="data source=quasq10\sql08a;initial catalog=MyDB ;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"'
$env = "DEV"
$oldServer = "quasq10"          
$newValue = "$env-AR-SQL.CORP.COM"

$connectionString -replace $oldServer, $newValue

res:///MonetDb.csdl|res:///MonetDb.ssdl|res://*/MonetDb.msl;provider=System.Data.SqlClient;provider connection string="data source=DEV-AR-SQL.CORP.COM\sql08a;initial catalog=MyDB ;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"

I think your foreach loop might not be getting the info you want, because it looks like your replace is fine.

$doc.configuration.connectionStrings.add

I haven't done much with XML, does the XML data type have an ADD member function? You aren't really adding anything, right?

As a test, what do you get from this:

$doc.configuration.connectionStrings | % {        
    $_.connectionString -replace $oldServer, $newValue;
}

Run that against a dummy file and see what happens.

For a sanity check on the replace operator:

$string = "The quick brown fox jumped over the lazy dog"
$oldColor = "brown"
$newColor = "orange"

$string -replace $oldColor, $newColor

To avoid digging through comments, this method worked

$string.Replace($oldColor,$newColor)

Upvotes: 1

Related Questions