我正在尝试使用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()
答案 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()