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-Archiveコマンドレットを使用できます。

于 2013-01-08T16:10:27.520 に答える
5

こんな質問もありました!この素晴らしいスクリプトに基づいて、この PS スクリプトを作成しました: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Specific-9b35352f

それが行うことは、見つかったzipファイルとともにすべての「txt」ファイルをリストするだけです!

元のスクリプトは、指定されたディレクトリにファイルをコピーします。これも非常に便利です。

いくつかのメモ:

静的変数を定義する必要があります。どのディレクトリ変数にも最後のバックスラッシュが含まれていないことを確認してください。つまり、「directory」であり、「directory/」ではありません。

ここにあります:

#----------------------------------------------------
# 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 に答える