如何在PowerShell中使用DotNetZip仅压缩文件而不压缩完整路径层次结构?

时间:2011-06-01 13:51:33

标签: powershell dotnetzip

我正在尝试使用DotNetZip和powershell压缩日志。这些文件位于C:\ user \ temp \ logs当我遍历目录中的日志并将它们添加到zip文件时,当我只想要日志文件时,我最终会得到文件夹层次结构和日志文件。

所以拉链最终包含:

-user
  └temp  
    └logs
       └log1.log
        log2.log
        log3.log

当我想要包含的zip文件是:

log1.log
log2.log
log3.log

以下是我正在测试的脚本:

[System.Reflection.Assembly]::LoadFrom("c:\\\User\\bin\\Ionic.Zip.dll");
$zipfile = new-object Ionic.Zip.ZipFile("C:\user\temp\logs\TestZIP.zip");

$directory = "C:\user\temp\logs\"
$children = get-childitem -path $directory
foreach ($o in $children)
{
   if($o.Name.EndsWith(".log")){
      $e = $zipfile.AddFile($o.FullName)
   }
}
$zipfile.Save()
$zipfile.Dispose()

2 个答案:

答案 0 :(得分:21)

您可以在AddFile覆盖档案中的文件名:

public ZipEntry AddFile(
    string fileName,
    string directoryPathInArchive
)
  

fileName(字符串

     

要添加的文件的名称。文件的名称可以是相对的   路径或完全合格的路径。

     

directoryPathInArchive(字符串

     

指定用于覆盖fileName中任何路径的目录路径。   该路径可以或可以不对应   到当前的真实目录   文件系统。如果文件在   zip是后来提取的,这就是   用于提取文件的路径。   传递null(VB中没有任何内容)将使用   fileName上的路径,如果有的话。   传递空字符串(“”)将会   将项目插入根路径   在档案馆内。

试试这个:

 $e = $zipfile.AddFile($o.FullName, $o.Name)

这也可能符合您的要求:

 $e = $zipfile.AddFile($o.FullName, "")

答案 1 :(得分:1)

未经测试,但我认为这应该有效。

[System.Reflection.Assembly]::LoadFrom("c:\\\User\\bin\\Ionic.Zip.dll");
$zipfile = new-object Ionic.Zip.ZipFile("C:\user\temp\logs\TestZIP.zip");

    $directory = "C:\user\temp\logs\"
    set-location $directory
    $children = get-childitem *.log
    foreach ($o in $children)
    {
        $e = $zipfile.AddFile($o.Name)
       }
    }
    $zipfile.Save()
    $zipfile.Dispose()