2013-01-07 14 views
7

Jestem nowicjuszem i szukam listy wszystkich plików zawartych w plikach zip w katalogu. Nie chcę używać żadnego narzędzia innej firmy.Jak wyświetlić listę plików w pliku zip w grze powershell?

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 

i tak dalej.

Niestety, moje środowisko nie ma wersji 4.5, ale 4.0. Udało mi się napisać ten kod, ale nadal wymaga on wiele analizowania, ponieważ rozpakowanie daje wiele dodatkowych informacji.

$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 

Czy istnieje łatwiejszy sposób analizowania tego. W wyjściu unzip -l znajduje się wiele dodatkowych informacji, takich jak nagłówki kolumn, separatory i daty oraz inna data przed każdą nazwą pliku.

+0

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

+0

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

Odpowiedz

16

W programie .NET Framework 4.5 dostępna jest klasa ZipFile, która jest bardzo przydatna.
Do listy wpisy w pliku archiwum, można go używać jak to w PowerShell:

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

Aktualizacja: Wydaje się to rade:]

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

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

Niestety moje środowisko nie jest środowiskiem .NET 4.5. – user487257

+0

Proszę zobaczyć aktualizację pytania. – user487257

+3

Aby zablokować plik .zip, możesz go zutylizować po przeczytaniu wpisów: '$ zip = [IO.Compression.ZipFile] :: OpenRead ($ sourceFile); $ entries = $ zip.Entries; $ zip.Dispose() ' –

2

Też miałem to pytanie! Stworzyłem ten skrypt PS na podstawie tego skryptu AWESOME: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Specific-9b35352f

Co to jest po prostu lista wszystkich plików "txt" wraz z znalezionymi plikami zip!

Oryginalny skrypt kopiuje pliki do określonego katalogu - co jest bardzo przydatne.

Kilka uwag:

Trzeba zdefiniować zmienne statyczne Upewnij żadna ze zmiennych katalogów zawierać ostateczną backslash czyli „Katalog”, a nie „katalog /”

Oto ona:

#---------------------------------------------------- 
# 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 
Powiązane problemy