2012-10-03 63 views
6

私有成员,我试图让乌里停止编码“/” 如这里解释: GETting a URL with an url-encoded slash访问从PowerShell的

但如何实现在PowerShell中的一样吗?

我试图按照访问私有财产和改变它的价值的路线,但我不能得到它的工作。

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

任何想法?

回答

0

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

$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) 
0
$uri.GetType().GetProperties('Instance,NonPublic') 
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不存在。)

+0

该代码工作正常,但对Uri不起作用,不幸的是。 我得到http://0.0.0.0/myoriginalip/restofthepath(仍然由Uri解析,所以'%2F'仍然与原来的'/' 我在.net单元测试中运行相同的代码,它的工作原理很好,我不明白为什么Powershell不遵循相同的模式,如果谁有更好的运气,请告诉我 – Jammes

+0

在进行状态的内部操作之前访问PathAndQuery非常重要。代码。 –

5

这是工作溶液对于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 

由于谷歌的API-dotnet的客户端path :-)请注意,存在与.NET 2.0差一些,我的代码工作> NET 2.0(用于< = 2.0版本,flagsValue对象的类型将是[Int32]而不是[Uint64]