在Powershell中读取ZIP中的文本文件

时间:2017-08-31 12:50:03

标签: powershell zip

我想读取存储在ZIP文件中的文本文件。 目前,我使用7Zip提取所需的文件,阅读它们并再次删除它们。 有没有办法在不将它们提取到硬盘上的情况下读取它们?

2 个答案:

答案 0 :(得分:3)

TL;博士

是的,有办法。但是有一个好方法吗? 不,绝对不是。

有一种方法。但这在很大程度上取决于您的操作系统。 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
}