#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? Спасибо!