2012-10-03 38 views
6

Tôi đang cố gắng để có được Uri để ngăn chặn mã hóa '/' Như đã giải thích ở đây: GETting a URL with an url-encoded slashTruy cập các thành viên tư nhân từ PowerShell

Nhưng làm thế nào để đạt được cùng trong PowerShell?

Tôi đang cố gắng đi theo tuyến đường truy cập vào tài sản riêng tư và thay đổi giá trị của nó nhưng tôi không thể làm cho nó hoạt động.

[Uri].GetProperties([System.Reflection.BindingFlags]::NonPublic) - không trả lại gì

Bất kỳ ý tưởng nào?

Trả lời

0

thử loại này (như trong liên kết của bạn):

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

để có được tính chất phi công cộng:

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

Lấy rằng bài khác như những gì bạn cần, bạn muốn điều này:

$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-band toán tử Bitwise không làm việc với bất kỳ loại lớn hơn [int] vì vậy tôi downcasting để [int] mà không làm tràn đối với trường hợp nêu trên (có nghĩa là giá trị cờ ngoài [int]::maxvalue không có mặt.)

+0

Mã hoạt động tốt nhưng không ảnh hưởng đến Uri. Tôi nhận được http://0.0.0.0/myoriginalip/restofthepath (vẫn được phân tích bởi Uri để '% 2F' vẫn được đảo ngược thành '/' Tôi đã chạy cùng một mã trong kiểm tra đơn vị .net và nó hoạt động Tôi không thực sự hiểu tại sao Powershell không theo cùng một khuôn mẫu Nếu ai có may mắn hơn hãy cho tôi biết – Jammes

+0

Điều quan trọng là truy cập PathAndQuery trước khi thực hiện thao tác bên trong của nhà nước. mật mã. –

5

Đây là giải pháp làm việc cho 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 

Nhờ google-api-DotNet-client path :-) xin lưu ý, rằng có một số khác biệt với .net 2.0, mã của tôi đang làm việc cho> .net 2.0 (đối với < = 2.0 phiên bản, loại đối tượng flagsValue sẽ là [Int32] thay vì [Uint64])

Các vấn đề liên quan