我想读取存储在ZIP文件中的文本文件。 目前,我使用7Zip提取所需的文件,阅读它们并再次删除它们。 有没有办法在不将它们提取到硬盘上的情况下读取它们?
答案 0 :(得分:3)
是的,有办法。但是有一个好方法吗? 不,绝对不是。
有一种方法。但这在很大程度上取决于您的操作系统。 PowerShell 5有Expand-Archive
,这使得使用7Zip已过时,但即使使用Expand-Archive
,您也必须提取整个存档以读取文件的内容。
使用Windows机器,您可以使用此shell.application
Com对象或system.io.compression.filesystem
来完成此操作:
How to read contents of a csv file inside zip file using PowerShell:
<强> 4。还有一种使用原生方式的方式:
Add-Type -assembly "system.io.compression.filesystem" $zip = [io.compression.zipfile]::OpenRead("e:\E.zip") $file = $zip.Entries | where-object { $_.Name -eq "XMLSchema1.xsd"} $stream = $file.Open() $reader = New-Object IO.StreamReader($stream) $text = $reader.ReadToEnd() $text $reader.Close() $stream.Close() $zip.Dispose()
XMLSchema1.xsd
是您的文件名。
链接的答案提到了其他一些方法(主要与外部依赖关系和Windows操作系统相关联)。他们中的大多数仍然提取至少一个文件,但确切地说:
答案 1 :(得分:0)
当我处理压缩日志文件时,压缩文件中只有一个文件。
我做了这个函数来获取日志文件的内容。
感谢 Andrey Marchuk 以及他在以下链接中回答的第 4 点。他的代码是我用来制作这个功能的。 How to read contents of a csv file inside zip file using PowerShell
function Get-ZippedLog {
param (
[Parameter(Mandatory=$true)]$ZipPath
)
Add-Type -assembly "system.io.compression.filesystem"
$zip = [io.compression.zipfile]::OpenRead($ZipPath)
$file = $zip.Entries[0]
$stream = $file.Open()
$reader = New-Object IO.StreamReader($stream)
$text = $reader.ReadToEnd()
$reader.Close()
$stream.Close()
$zip.Dispose()
return $text
}