7zip / Powershell копирование измененных элементов в родительский каталог

#powershell #compression #backup #7zip

Вопрос:

У меня есть следующий блок сценариев, встроенный в мой сценарий:

 $changedItems = (Get-ChildItem $srcdirectory -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-24)} | where { ! $_.PSIsContainer }).FullName

    foreach ($changedItem in $changeditems){ 
        $archivePath = Join-Path -Path $dstDirectory -ChildPath ($archiveName   "_"   $fileDate   ".zip")
        $7zipArgs = @(
        "a";        
        "-mx=9";    
        "-tzip";    
        $archivePath;
        $changedItem;
    )
    7zip @7zipArgs
    }
 

Предполагается, что он просто идентифицирует элементы, которые изменились за последние 24 часа, и архивирует их в почтовый каталог.

В исходном каталоге, который я запрашиваю, содержится много данных, поэтому следующая часть блока позволяет копировать только измененные файлы:

 | where { ! $_.PSIsContainer }
 

Это устраняет следующую проблему, возникающую с рекурсивной частью Get-Childitem:

Если бы существовала папка, которая была недавно изменена, но файлы внутри папки не были изменены, вся папка и ее полное содержимое были бы заархивированы.

однако:

Теперь у меня есть только измененные файлы, которые я хочу, но в моем новом zip-файле нет никакой иерархии. Все файлы находятся непосредственно в zip-файле, без какого-либо родительского каталога.

Пример:

Измененные файлы из исходного каталога:

 SourceDirectoryABfile1
SourceDirectory1file2
SourceDirectoryxyzfile3
 

Заходите в новый застегнутый на молнию archive.zip вот так:

 file1
file2
file3
 

Но я хочу сохранить родительские каталоги в archive.zip вот так:

 ABfile1
1file2
xyzfile3
 

Есть ли какой-нибудь способ сделать это?

Я надеюсь, что объяснение не слишком сложное, пожалуйста, не стесняйтесь запрашивать дополнительную информацию, если она не ясна. Мне нужно было добавить столько контекста, потому что это очень специфическая проблема.

Спасибо за всю помощь и советы.

Комментарии:

1. Ваши переменные $dstDirectory $archiveName и $filedate , кажется, берутся из ниоткуда.. Вы должны взять их из свойств объекта FileInfo $changedItem

2. Привет @Тео, спасибо за твой комментарий! Это только часть сценария, переменные, которые вы упоминаете, определены ранее в сценарии. Не могли бы вы пояснить, почему это помогло бы, если бы я определил их из свойств $changedItem? Спасибо!