2013-01-07 4 views
7

Ich bin neu in Powershell und suchen, um alle Dateien aufzulisten, die in ZIP-Dateien in einem Verzeichnis enthalten sind. Ich möchte kein Drittanbieter-Tool verwenden.Wie listet man die Dateien in einer Powershell in zip auf?

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 

und so weiter.

Leider ist meine Umgebung nicht 4,5, sondern 4,0. Ich war in der Lage, diesen Code zu schreiben, aber es braucht noch viel Parsing für Aufräumen als unzip gibt eine Menge zusätzlicher Informationen.

$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 

Gibt es eine einfachere Möglichkeit, dies zu analysieren. Es gibt viele zusätzliche Informationen in der Ausgabe von unzip-l, wie Spaltenüberschriften, Trennzeichen und Datumsangaben und ein anderes Datum vor jedem Dateinamen.

+0

http://www.minasi.com/forum/topic.asp?TOPIC_ID=26804 –

+0

http://learningpcs.blogspot.com/2010/07/powershell-working-with-zip-files.html –

Antwort

16

In .NET Framework 4.5 gibt es eine ZipFile-Klasse, die sehr praktisch ist.

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

Update:: Dies scheint den Trick zu tun:
Um die Einträge in einer Archivdatei auflistet, können Sie es wie folgt in Powershell verwenden]

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

foreach($sourceFile in (Get-ChildItem -filter '*.zip')) 
{ 
    [IO.Compression.ZipFile]::OpenRead($sourceFile.FullName).Entries.FullName | 
     %{ "$sourcefile`:$_" } 
} 
+0

Leider mein Umgebung ist nicht .NET Framework 4.5. – user487257

+0

Bitte beachten Sie das Update zu der Frage. – user487257

+3

Damit die ZIP-Datei nicht gesperrt werden kann, können Sie sie nach dem Lesen der Einträge löschen: '$ zip = [IO.Compression.ZipFile] :: OpenRead ($ sourceFile); $ entries = $ zip.Entries; $ zip.Dispose() ' –

2

Ich hatte diese Frage auch! Ich erstellte dieses PS-Skript basierend auf diesem AWESOME-Skript: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Specific-9b35352f

Was es tut, ist einfach alle 'TXT' Dateien zusammen mit den gefundenen ZIP-Dateien auflisten!

Das ursprüngliche Skript kopiert die Dateien in ein bestimmtes Verzeichnis - was ebenfalls sehr nützlich ist.

Einige Anmerkungen:

Sie haben die statischen Variablen definieren sicher, dass keiner der Verzeichnis Variablen Führen Sie die endgültige Backslash dh „Verzeichnis“ enthalten und nicht „Verzeichnis /“

Hier ist sie:

#---------------------------------------------------- 
# 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 
Verwandte Themen