2011-06-01 62 views
15

我想使用DotNetZip和PowerShell壓縮日誌。這些文件位於C:\ user \ temp \ logs當我遍歷目錄中的日誌並將它們添加到zip文件時,當我僅需要日誌文件時,最終會生成文件夾層次結構和日誌文件。如何在PowerShell中僅使用DotNetZip壓縮文件而不是完整路徑層次結構?

所以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() 

回答

20

有一個AddFile您可以覆蓋檔案中的文件名:

public ZipEntry AddFile(
    string fileName, 
    string directoryPathInArchive 
) 

文件名(字符串

文件的名稱添加。該文件的名稱可能是相對路徑或完全限定的路徑,即 。

directoryPathInArchive(字符串

指定用於覆蓋在文件名的任何路徑的目錄路徑。 此路徑可能或可能不對應 到當前的 文件系統中的實際目錄。如果以後提取 zip內的文件,則這是用於提取文件的 路徑。 傳遞null(VB中沒有)將使用 fileName上的路徑(如果有的話)。 傳遞空字符串(「」)將 插入存檔中根路徑 的項目。

試試這個:

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

也有可能,這你想要做什麼:

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

這也正是我想'$ E = $ zipfile.AddFile($ o.FullName,「」) ' – ProfessionalAmateur 2011-06-01 14:14:33

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() 
+0

一個原因這是行不通的是,設置地點不會改變當前目錄該過程。您傳遞給對象方法的任何路徑都與進程的當前目錄相關。這似乎是PowerShell常見的陷阱。 – OldFart 2011-06-01 14:52:41

相關問題