7

我试图让 Uri 停止编码'/' 如此处所述: GETting a URL with an url-encoded slash

但是如何在 powershell 中实现相同的功能?

我正在尝试遵循访问私有财产并更改其价值的路线,但我无法让它发挥作用。

[Uri].GetProperties([System.Reflection.BindingFlags]::NonPublic)- 不返回任何内容

有任何想法吗?

4

4 回答 4

7

这是适用于 PowerShell 的有效解决方案:

$uri = [Uri]"http://example.com/%2F"
# access the .PathAndQuery field to initialize the Uri object
$pathAndQuery = $uri.PathAndQuery
$flagsField = $uri.GetType().GetField("m_Flags", [Reflection.BindingFlags]::NonPublic -bor [Reflection.BindingFlags]::Instance)
$flagsValue = [UInt64]$flagsField.GetValue($uri)
# remove flags Flags.PathNotCanonical and Flags.QueryNotCanonical
$flagsValue = [UInt64]($flagsValue -band (-bnot 0x30));
$flagsField.SetValue($uri, $flagsValue)
Write-Host $uri.AbsoluteUri

感谢 google-api-dotnet-client path :-) 请注意,与 .net 2.0 存在一些差异,我的代码适用于 > .net 2.0(对于 <= 2.0 版本,flagsValue对象的类型将[Int32][Uint64])

于 2013-08-29T13:11:07.930 回答
1

以其他帖子为您所需要的,您想要这个:

$uri = [uri]"http://example.com/%2F"
$f = [uri].getfield("m_Flags", "nonpublic,instance")
$v = [int]($f.getvalue($uri))
$f.setvalue($uri, [uint64]($v -band (-bnot 0x30)))

PowerShell-bnot-band按位运算符不适用于任何大于以上的类型,[int]因此我向下转换[int]为在上述情况下不会溢出的类型(这意味着[int]::maxvalue不存在超出的标志值。)

于 2012-10-03T14:13:37.660 回答
1

试试这个(就像在你的链接中一样):

$uri.GetType().GetField("m_Flags", [System.Reflection.BindingFlags]::Instance -bor `
 [System.Reflection.BindingFlags]::NonPublic)

获取非公共属性:

$uri.GetType().GetProperties( [System.Reflection.BindingFlags]::Instance -bor `
[System.Reflection.BindingFlags]::NonPublic )
于 2012-10-03T13:34:51.017 回答
0
$uri.GetType().GetProperties('Instance,NonPublic')
于 2012-10-03T13:46:40.367 回答