2014-09-03 58 views
0

在Powershell中,我试图替换连接字符串配置,但需要做两个不同的替换。如何替换文件中的字符串,但不匹配字符串,但不包含它在PowerShell中包含子字符串? (正则表达式)

特别是,我试图替换连接字符串的用户ID部分,但我们有时使用不同的用户ID需要被不同的替换。

示例连接字符串:

Server=Machine;Database=db;uid=user1;pwd=pass; 

Server=Machine2;Database=db2;uid=user1_abc;pwd=pass; 

1)什么将一个正则表达式替换字符串是只更换UID当用户没有在用户ID _abc?

2)与此相反,如何取代只有_abc的那个?

例如,这二者匹配,这将无法正常工作:

$string -replace "uid=[^;]*" "uid=$myuser" 

3)第三个问题是如何与_abc区分PWD的只有用户仅VS无_abc?

我已经尝试了部分单词排除提议的变体,但似乎没有按预期工作。

+0

你想解决什么问题?它看起来像在预先部署.NET配置文件中更改连接字符串。这是在一个web.config? machine.config? .NET有一个用于更改这些值的API,可能更容易。 – 2014-09-04 00:05:50

回答

0

1)为了不_abc匹配用户:

uid=(.*(?<!_abc));p 

?<!是负向后断言。也就是说,它与它背后的内容相符。

2)与_abc匹配用户:

uid=(.*_abc);p 

3)你会区分你更换UID相同的方式来使用的密码。事情是这样的:

$string -replace "uid=(.*(?<!_abc));pwd=(.*);" "uid=$myuser;pwd=$pw;" 
0

你可以使用一个开关,一些正则表达式后向断言:如果他们不立即之前有_abc

$ConStrings = Switch -regex ($ConStrings){ 
    "uid=[^;]*?(?<!_abc);pwd=" {$_ -replace "uid=[^;]*?(?<!_abc);pwd=", "uid=$NonABCUser;pwd="} 
    "uid=[^;]*?(?<=_abc);pwd=" {$_ -replace "uid=[^;]*?(?<=_abc);pwd=", "uid=$ABCUser;pwd="} 
} 

第一行相匹配; PWD,且仅当它们确实有它的第二行相匹配。

0

而不是使用复杂的正则表达式,另一种选择是使用System.Data.Common.DbConnectionStringBuilder解析连接字符串:

[Reflection.Assembly]::LoadWithPartialName("System.Data") 
$conn = new-object System.Data.Commmon.DbConnectionStringBuilder 
# need to use the method rather than the property since it implements IDictionary 
$conn.set_ConnectionString("Server=Machine;Database=db;uid=user1;pwd=pass;") 
if ($conn.uid -like "*_abc") { 
    $conn.uid = $myuser 
} 
elseif ($conn.uid -notlike "*_abc" -and $conn.pwd -match "\d+") { 
    # Do something leave out the elseif clause. 
} 

$connectionString = $conn.ConnectionString 

-like操作符用来匹配以_abc结尾的任何UID使用通配符。有一个互补的-notlike运营商。还有-match-notmatch运算符用于完整的正则表达式匹配。

相关问题