2011-06-01 26 views
15

Estoy tratando de comprimir el registro utilizando DotNetZip y powershell. Los archivos están en C: \ user \ temp \ logs Cuando recorro los registros en el directorio y los agrego al archivo zip, termino con la jerarquía de carpetas y los archivos de registro cuando solo quiero los archivos de registro.¿Cómo comprimir solo archivos y no la jerarquía de ruta completa con DotNetZip en powershell?

Así el zip que contiene termina:

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

Cuando quiero el archivo zip que contiene es:

log1.log 
log2.log 
log3.log 

Este es el guión que estoy corriendo a probar con:

[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() 

Respuesta

20

Hay un AddFile donde puede anular el nombre del archivo en el archivo:

public ZipEntry AddFile(
    string fileName, 
    string directoryPathInArchive 
) 

nombre de archivo (cadena)

El nombre del archivo que desea añadir. El nombre del archivo puede ser una ruta relativa o una ruta completa.

directoryPathInArchive (cadena)

Especifica una ruta de directorio a utilizar para anular cualquier ruta en el nombre de archivo. Esta ruta puede, o no, corresponder a un directorio real en el sistema de archivos actual . Si posteriormente se extraen los archivos dentro del zip , esta es la ruta utilizada para el archivo extraído. Al pasar nulo (Nothing en VB) se usará la ruta en el nombre de archivo, si corresponde. Al pasar la cadena vacía ("") se inserte el elemento en la ruta de la raíz dentro del archivo.

Prueba esto:

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

También es posible que esto hace lo que quiere:

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

Esto hizo exactamente lo que quería '$ e = $ zipfile.AddFile ($ o.FullName, "") ' – ProfessionalAmateur

1

No se ha probado, pero creo que esto debería funcionar.

[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

Una razón esto no funcionaría es que Set-Location no cambia el directorio actual para el proceso. Cualquier ruta que pase a métodos en objetos es relativa al directorio actual del proceso. Esto parece ser un error muy común con PowerShell. – OldFart

Cuestiones relacionadas