2012-10-03 33 views

Respuesta

0

probar esto (como en su enlace):

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

para obtener propiedades no comunes:

$uri.GetType().GetProperties([System.Reflection.BindingFlags]::Instance -bor ` 
[System.Reflection.BindingFlags]::NonPublic) 
0
$uri.GetType().GetProperties('Instance,NonPublic') 
1

Tomando ese otro puesto de lo que necesita, desea que esta:

$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's -bnot y -band operadores de bits no funcionan con cualquier tipo grande que [int] así que estoy downcasting a [int] que no se desborde en el caso anterior (lo que significa que los valores de bandera allá [int]::maxvalue no están presentes.)

+0

El código funciona bien pero lamentablemente no tiene ningún efecto en Uri. Obtengo http://0.0.0.0/myoriginalip/restofthepath (todavía analizado por Uri así que '% 2F' aún se invierte a '/' original Ejecuté el mismo código en la prueba de unidad .net y funciona Bien. Realmente no entiendo por qué Powershell no sigue el mismo patrón. Si alguien tiene mejor suerte házmelo saber. – Jammes

+0

Es importante acceder a PathAndQuery antes de hacer la manipulación interna del estado. Se está salteando esa parte de el código. –

5

Esta es la solución de trabajo para 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 

gracias a google-api-dotnet-cliente path :-) tenga en cuenta, que hay alguna diferencia con .NET 2.0, el código está trabajando para> .NET 2.0 (por < = 2.0 versiones, el tipo de objeto flagsValue será [Int32] en lugar de [Uint64])

Cuestiones relacionadas