Как заархивировать только файлы, а не полную иерархию путей с помощью DotNetZip в powershell? - PullRequest
16 голосов
/ 01 июня 2011

Я пытаюсь сжать журнал, используя 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 ]

21 голосов
/ 01 июня 2011

Существует AddFile , где вы можете переопределить имя файла в архиве:

public ZipEntry AddFile(
    string fileName,
    string directoryPathInArchive
)

fileName ( String )

Имя файла для добавления. Название файла может быть относительным путь или полностью определенный путь.

directoryPathInArchive ( Строка )

Указывает путь к каталогу, который будет использоваться для переопределения любого пути в fileName. Этот путь может или не может соответствовать в реальный каталог в текущем файловая система. Если файлы в почтовый индекс позже извлечен, это путь, используемый для извлеченного файла. Передача ноль (ничего в VB) будет использовать путь к файлу name, если есть. Передача пустой строки ("") вставить элемент в корневой путь в архиве.

Попробуйте это:

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

Также возможно, что это делает то, что вы хотите:

 $e = $zipfile.AddFile($o.FullName, "")
1 голос
/ 01 июня 2011

Не проверено, но я думаю, что это должно работать.

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