21

我是 powershell 的新手,希望列出目录中 zip 文件中包含的所有文件。我不想使用任何第三方工具。

Structure of the directory is
mydir > dir
a.zip
b.zip
c.zip

with each file containing files named 1.txt or 2.txt or 3.txt

I am trying to get an output in the form

a.zip:1.txt
a.zip:2.txt
b.zip:files\3.txt
b.zip:4.txt
c.zip:1.txt
d.zip:10.txt 

等等。

不幸的是,我的环境不是 4.5 而是 4.0。我能够写出这段代码,但它仍然需要大量的解析来清理,因为解压缩会提供很多额外的信息。

$packagedir="C:\Packages"
$unzipcmd = "c:\bins\unzip.exe -l"
$unmatchstr = "*Archive*"
pushd .
cd $packagedir

$filelist= Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName

 foreach ($item in $filelist) 
 {$ziplist = Invoke-Expression "$unzipcmd $item"; 
 foreach ($item2 in $ziplist) 
  {
   if ($item2.Contains("Archive") )
   {

   }
   else
   {
     echo $item "::" $item2}} 
   }
popd

有没有更简单的方法来解析这个。unzip -l 输出中有很多额外的信息,如列标题、分隔符和日期以及每个文件名之前的其他日期。

4

3 回答 3

30

在 .NET Framework 4.5 中有一个非常方便的 ZipFile 类。
要列出存档文件中的条目,您可以在 Powershell 中像这样使用它:

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[IO.Compression.ZipFile]::OpenRead($sourceFile).Entries

更新:这似乎可以解决问题:]

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')

foreach($sourceFile in (Get-ChildItem -filter '*.zip'))
{
    [IO.Compression.ZipFile]::OpenRead($sourceFile.FullName).Entries.FullName |
        %{ "$sourcefile`:$_" }
}
于 2013-01-07T21:45:12.537 回答
6

如果你有PowerShell Community Extensions,你可以使用它的Read-Archivecmdlet。

于 2013-01-08T16:10:27.520 回答
5

我也有这个问题!我根据这个 AWESOME 脚本制作了这个 PS 脚本:https ://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Specific-9b35352f

它所做的只是列出所有“txt”文件以及找到的 zip 文件!

原始脚本将文件复制到指定的目录中——这也非常有用。

一些注意事项:

您必须定义静态变量确保没有目录变量包含最后的反斜杠,即“目录”而不是“目录/”

这里是:

#----------------------------------------------------
# STATIC VARIABLES 
#----------------------------------------------------

$search  = "txt"
$zips   = "C:\zipfiles" 

#----------------------------------------------------
Function GetZipFileItems 
{ 
    Param([string]$zip) 

    $split = $split.Split(".")

    $shell   = New-Object -Com Shell.Application 
    $zipItem = $shell.NameSpace($zip) 
    $items   = $zipItem.Items() 

    GetZipFileItemsRecursive $items
}

Function GetZipFileItemsRecursive 
{     
    Param([object]$items) 
    ForEach($item In $items) 
    {
        $strItem = [string]$item.Name 
        If ($strItem -Like "*$search*")
        { 
            Write-Host "The txt files in the zips are : $strItem"   
        }
    }
}

Function GetZipFiles 
{ 
    $zipFiles = Get-ChildItem -Path $zips -Recurse -Filter "*.zip" | % { $_.DirectoryName + "\$_" } 

    ForEach ($zipFile In $zipFiles) 
    { 
        $split = $zipFile.Split("\")[-1] 
        Write-Host "Found zip-file : $split" 
        GetZipFileItems $zipFile 
    } 
}
GetZipFiles
于 2016-09-17T08:50:02.177 回答