Powershell - 从.zip压缩文件中读取文件失败
问题描述:
我目前正在尝试读取.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
前两个字节似乎总是等于255
和254
,这会导致PowerShell的XML解析器抛出一个例外。
作为临时的解决方法,我尝试省略前两个字节,但这只是最后两个字节发生同样的问题。
这将我引向我的问题,缓冲区如何被混淆?
我的做法错误吗?我错过了什么?
任何帮助,高度赞赏!
UPDATE:
好,似乎Windows使用UTF-16作为内部编码,这将意味着前两个字节是Byte Order Mark (BOM)
。我期望GetString()
方法识别BOM
,有人可以澄清这一点?
答
你要包装你的流为StreamReader
,然后使用ReadToEnd()
方法,我期望尊重BOM:
$reader = new-object System.IO.StreamReader($entr.Open())
$contents = $reader.ReadToEnd()
$reader.Close()
这确实奏效了! “System.Text.UnicodeEncoding”类是否有任何理由不尊重BOM? –
我必须检查框架资源。我怀疑它与你通过使用指定的Encoding类告诉系统缓冲区是某种类型的事实有关。如果使用'StreamReader',你可以让框架在构造字符串缓冲区时检测正确的编码。 – jessehouwing