2012-10-03 21 views
6

Ich versuche, Uri zu erhalten Codierung zu stoppen ‚/‘ Wie hier erklärt: GETting a URL with an url-encoded slashZugriff auf private Mitglieder von Powershell

Aber wie das gleiche in Powershell zu erreichen?

Ich versuche, den Weg des Zugangs zu Privateigentum zu verfolgen und seinen Wert zu ändern, aber ich kann es nicht zum Funktionieren bringen.

[Uri].GetProperties([System.Reflection.BindingFlags]::NonPublic) - kehrt nichts

Irgendwelche Ideen?

Antwort

0

versuchen, diese (wie in Ihrem Link):

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

nicht öffentliche Eigenschaften zu erhalten:

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

nehmen, dass andere Posten wie das, was Sie benötigen, wollen Sie dies:

$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))) 

PowerShells -bnot und -band Bitoperatoren funktionieren nicht mit irgendwelchen Typen größer als [int] so zu [int] ich einziehe, die für den obigen Fall nicht überlaufen (die Flag-Wert bedeutet, jenseits [int]::maxvalue nicht vorhanden sind.)

+0

Der Code funktioniert gut, hat aber leider keine Auswirkungen auf Uri. Ich bekomme http://0.0.0.0/myoriginalip/restofthepath (noch von Uri geparst so '% 2F' ist immer noch auf das Original '/' Ich lief den gleichen Code in .net Unit Test und es funktioniert Ich verstehe nicht wirklich, warum Powershell nicht dem gleichen Muster folgt. Wenn jemand mehr Glück hat, lassen Sie es mich wissen. – Jammes

+0

Es ist wichtig, auf PathAndQuery zuzugreifen, bevor Sie die interne Manipulation des Status vornehmen. Sie überspringen diesen Teil von der Code. –

5

Dies ist Arbeitslösung für 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 

Dank google-api-dotnet-Client path :-) bitte beachten Sie, dass es einige Unterschiede mit .net 2.0 ist, arbeitet mein Code für> .net 2.0 (für < = 2,0 Versionen, der Typ flagsValue Objekt wird [Int32] anstelle vonsein)

Verwandte Themen