我正在尝试使用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中作为解析器工作?
这可能是一个错误(无论如何也是一个陷阱),我会尽快提交。看起来PowerShell不会在实现的类的属性上调用设置方法IDictionary(DbConnectionStringBuilder确实如此,它是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)
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)
| 归档时间: |
|
| 查看次数: |
2433 次 |
| 最近记录: |