2011-12-30 54 views
1

在PowerShell中V2以下返回當前編輯在PowerShell V3 CTP2 ISE中發生了什麼?

$a=$psise.CurrentPowerShellTab.Files[0] 
$a.gettype().getfield("encoding","nonpublic,instance").getvalue($a) 

的編碼,並與

$a=$psise.CurrentPowerShellTab.Files[0] 
$a.gettype().getfield("encoding","nonpublic,instance").setvalue($a,[text.encoding]::ascii) 

可以將編碼設置爲ASCII。比照this post

嘗試與PowerShell V3相同失敗。很顯然getfield()不返回對象。任何想法來解決這個問題?

回答

3

您使用反射攻入一類的非公共成員任何時候,你正在運行在將來的版本中會有風險。這就是發生在這裏的事情。

這就是說,試試這個:

$psise.CurrentPowerShellTab.Files | % { 
    $_.gettype().getfield("doc","nonpublic,instance").getvalue($_).Encoding = [text.encoding]::ascii 
} 

或者引用整個腳本:

# watch for changes to the Files collection of the current Tab 
register-objectevent $psise.CurrentPowerShellTab.Files collectionchanged -action { 
    # iterate ISEFile objects 
    $event.sender | % { 
     # set encoding on private ITextDocument field to ASCII 
     $_.gettype().getfield("doc","nonpublic,instance").getvalue($_).Encoding = [text.encoding]::ascii 
    } 
} 
+0

它的工作原理。你能給出一個提示,如何列出所有非公開成員,或者是否值得另一個問題? – 2012-01-05 15:15:36

+0

dotPeek或justDecompile或反射...等 – Jaykul 2012-01-06 18:09:58

+0

或捅;-) github.com/oising/poke/ – x0n 2014-01-19 05:55:59

1

我以前從來沒有嘗試過(在V2),但看起來這是工作在CTP2:

PS> $a = $psise.CurrentPowerShellTab.Files[0] 
PS> $a.Encoding 

BodyName   : utf-8 
EncodingName  : Unicode (UTF-8) 
HeaderName  : utf-8 
WebName   : utf-8 
WindowsCodePage : 1200 
IsBrowserDisplay : True 
IsBrowserSave  : True 
IsMailNewsDisplay : True 
IsMailNewsSave : True 
IsSingleByte  : False 
EncoderFallback : System.Text.EncoderReplacementFallback 
DecoderFallback : System.Text.DecoderReplacementFallback 
IsReadOnly  : True 
CodePage   : 65001 


PS> $a.Save([text.encoding]::ascii) 
PS> $a.Encoding 

IsSingleByte  : True 
BodyName   : us-ascii 
EncodingName  : US-ASCII 
HeaderName  : us-ascii 
WebName   : us-ascii 
WindowsCodePage : 1252 
IsBrowserDisplay : False 
IsBrowserSave  : False 
IsMailNewsDisplay : True 
IsMailNewsSave : True 
EncoderFallback : System.Text.EncoderReplacementFallback 
DecoderFallback : System.Text.DecoderReplacementFallback 
IsReadOnly  : True 
CodePage   : 20127