2016-03-07 153 views
1

我目前正在嘗試讀取.zip壓縮文件中特定.xml文件的內容而不提取它。
代碼很簡單,但不知怎的,有幾個字節滑入緩衝區,使得不可能使用文件的內容。Powershell - 從.zip壓縮文件中讀取文件失敗

這是各自的代碼:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") 
    $arch = [System.IO.Compression.ZipFile]::OpenRead("C:\file.zip") 

    $entr = $arch.Entries | ?{$_.Name -like "test.xml"} 
    if(!$entr) 
    {throw [System.Exception] "Could not find the .xml file"} 

    $buf = New-Object System.Byte[]($entr.Length) 
    $entr.Open().Read($buf, 0, $entr.Length) | Out-Null 

    $xml = [xml] ([System.Text.Encoding]::Unicode.GetString($buf)) 

的代碼是非常簡單的我會說,但可悲的$buf前兩個字節似乎總是等於255254,這會導致PowerShell的XML解析器拋出一個例外。
作爲臨時的解決方法,我嘗試省略前兩個字節,但這只是最後兩個字節發生同樣的問題。

這將我引向我的問題,緩衝區如何被混淆?
我的做法錯誤嗎?我錯過了什麼?

任何幫助,高度讚賞!

UPDATE:

好,似乎Windows使用UTF-16作爲內部編碼,這將意味着前兩個字節是Byte Order Mark (BOM)。我期望GetString()方法識別BOM,有人可以澄清這一點?

回答

0

你要包裝你的流爲StreamReader,然後使用ReadToEnd()方法,我期望尊重BOM:

$reader = new-object System.IO.StreamReader($entr.Open()) 
$contents = $reader.ReadToEnd() 
$reader.Close() 
+0

這確實奏效了! 「System.Text.UnicodeEncoding」類是否有任何理由不尊重BOM? –

+0

我必須檢查框架資源。我懷疑它與你通過使用指定的Encoding類告訴系統緩衝區是某種類型的事實有關。如果使用'StreamReader',你可以讓框架在構造字符串緩衝區時檢測正確的編碼。 – jessehouwing