Powershell создает ZIP-файлы между двумя датами - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь заархивировать файлы, созданные между 2 датами.

param(
[String]$path="DieserPfadWirdAlsParameterGesetzt"
)

$exclude=@("*.zip")
$currentYear = (Get-Date).AddYears(-1).ToString("yyyy")

$firstDayOfYear = Get-Date -Day 1 -Month 1 -Year $currentYear -Hour 0 -Minute 0 -Second 0
$lastDayOfYear = Get-Date -Day 31 -Month 12 -Year $currentYear -Hour 23 -Minute 59 -Second 59

$files = Get-ChildItem -Path $path -recurse -exclude "$exclude" |     
    where {
        $_.CreationTime -ge $firstDayOfYear -and             
        $_.CreationTime -lt $lastDayOfYear            
          }

Compress-Archive -Path $files.FullName -DestinationPath "$path\Archiv$currentYear.zip"
Remove-Item $files.FullName -Recurse -Force -Exclude $exclude

скрипт работает, но ... скажем, в каталоге C:\Users\...\Test это папка, которая была создана в 2018 году и вэта папка является файлом, который также был создан в 2018 году. Сценарий создаст новый zip-файл (Archiv2018.zip), но в zip-папке будет папка с файлом И одним файлом ...

Есть ли способ, которым будет заархивирована только папка с файлом в ней, а не папка с файлом в нем И одним файлом?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Ваша строка Get-ChildItem приводит к целому множеству возвращаемых предметов.Независимо от того, когда они являются файлами или папками.В итоге вы получите массив объектов, содержащий оба.

На абстрактном уровне это будет выглядеть так:

  • folder \
  • folder \ a.file
  • folder \ b.file

Если вы посмотрите на определение Compress-Archive, вы найдете следующее описание параметра -Path.

Указывает путь или пути к файлам, которые вы хотите добавить в архивированный архивный файл.Этот параметр может принимать символы подстановки.Подстановочные знаки позволяют вам добавлять все файлы в папке в ваш архивный файл.Чтобы указать несколько путей и включить файлы в несколько мест в выходном заархивированном файле, используйте запятые для разделения путей.

Он не сохраняет путь, если вы передаете ему один файл.Таким образом, он покорно архивирует все в Folder\ и добавляет a.file и b.file.

Чтобы обойти это, вы можете указать дополнительный фильтр для Get-ChildItem, например -File или -Directory просто получить файлы или каталоги.Я предполагаю, что вы просто хотите, чтобы файлы имели соответствующую структуру папок.

Чтобы это работало, вы можете скопировать файлы во временную папку и сжать всю временную папку.Он будет содержать только те файлы, которые вы хотите.

0 голосов
/ 30 января 2019

Добавьте -File к вашему Get-ChildItem, чтобы возвращать только файлы:

Get-ChildItem -Path $path -recurse -exclude "$exclude" -File
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...