在PowerShell中使用时,DbConnectionStringBuilder不解析

Rom*_*min 6 powershell

我正在尝试使用DbConnectionStringBuilder解析类似连接字符串的用户输入的功能.这在C#中运行得很好:

using System;
using System.Data.Common;
class Program
{
    static void Main(string[] args)
    {
        var sb = new DbConnectionStringBuilder();
        sb.ConnectionString = "server = 'smtp.gmail.com'; port = 587; user = you@gmail.com";
        Console.WriteLine(sb["server"]);
        Console.WriteLine(sb["port"]);
        Console.WriteLine(sb["user"]);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

smtp.gmail.com
587
you@gmail.com
Run Code Online (Sandbox Code Playgroud)

但它在PowerShell中不起作用.也就是说,这是PowerShell中的字面翻译代码

$sb = New-Object System.Data.Common.DbConnectionStringBuilder
$sb.ConnectionString = "server = 'smtp.gmail.com'; port = 587; user = you@gmail.com"
$sb["server"]
$sb["port"]
$sb["user"] 
Run Code Online (Sandbox Code Playgroud)

根本不产生输出.

有什么想法吗?如何DbConnectionStringBuilder在PowerShell中作为解析器工作?

Rom*_*min 5

这可能是一个错误(无论如何也是一个陷阱),我会尽快提交。看起来PowerShell不会在实现的类的属性上调用设置方法IDictionaryDbConnectionStringBuilder确实如此,它是ConnectionString解析字符串的设置方法)。

这是两个演示(原始演示和解决方法):

# test 1 - does not work, presumably PowerShell invokes $sb["ConnectionString"] = .. instead of the setter
$sb = New-Object System.Data.Common.DbConnectionStringBuilder
$sb.ConnectionString = "server = 'smtp.gmail.com'; port = 587; user = you@gmail.com"

# the original string
$sb.ConnectionString

# nothing at all
$sb["server"]
$sb["port"]
$sb["user"]

# test 2 - works fine, we make PowerShell to invoke the ConnectionString property setter in this way
$sb = New-Object System.Data.Common.DbConnectionStringBuilder
$sb.PSObject.Properties['ConnectionString'].Value = "server = 'smtp.gmail.com'; port = 587; user = you@gmail.com"

# parsed and re-formatted string
$sb.ConnectionString

# parsed data
$sb["server"]
$sb["port"]
$sb["user"]
Run Code Online (Sandbox Code Playgroud)

输出:

server = 'smtp.gmail.com'; port = 587; user = you@gmail.com
server=smtp.gmail.com;port=587;user=you@gmail.com
smtp.gmail.com
587
you@gmail.com
Run Code Online (Sandbox Code Playgroud)

就找到解决方法而言,我们免费获得了一个非常强大的解析器,用于处理类似连接字符串的数据。这是演示如何解析相当复杂的输入的演示:

# get the parser
$sb = New-Object System.Data.Common.DbConnectionStringBuilder

# input the string to parse using this workaround way
$sb.PSObject.Properties['ConnectionString'].Value = @'
Apostrophes = "Some 'value'";
Quotations = 'Some "value"';
Semicolons = '1; 2; 3';
Multiline = Line1
Line2
Line3;
Name with spaces = Some value;
Name with == sign = Some value;
'@

# get the parsed results

# the string: not the original but parsed and re-formatted
$sb.ConnectionString

# the data: parsed key/values
$sb | Format-Table -AutoSize -Wrap
Run Code Online (Sandbox Code Playgroud)

输出:

apostrophes="Some 'value'";quotations='Some "value"';semicolons="1; 2; 3";multiline="Line1
Line2
Line3";name with spaces="Some value";name with == sign="Some value"

Key              Value              
---              -----              
apostrophes      Some 'value'       
quotations       Some "value"       
semicolons       1; 2; 3            
multiline        Line1              
                 Line2              
                 Line3              
name with spaces Some value         
name with = sign Some value         
Run Code Online (Sandbox Code Playgroud)


Joe*_*ant 5

System.Data.Common.DbConnectionStringBuilder实施IDictionary.Powershell有一个字典使用的简写.,允许检索和分配键/值对,就好像键是一个属性:

$dict = @{}
$dict["key1"] = 'value1'
$dict.key2 = 'value2'
Run Code Online (Sandbox Code Playgroud)

您可以看到它将整个连接字符串存储为键/值对,而不是以ConnectionString这种方式存储在属性上:

$sb = New-Object System.Data.Common.DbConnectionStringBuilder
$sb.ConnectionString = "server = 'smtp.gmail.com'; port = 587; user = you@gmail.com"
$sb #formatted table of key/value pairs
Run Code Online (Sandbox Code Playgroud)

解决此问题的最简单方法是调用为属性生成的set_/ get_方法:

$sb = New-Object System.Data.Common.DbConnectionStringBuilder
$sb.set_ConnectionString("server = 'smtp.gmail.com'; port = 587; user = you@gmail.com")
$sb["server"]
$sb["port"]
$sb["user"]
Run Code Online (Sandbox Code Playgroud)