Powershell - Добавить папку / файлы в zip-архив, исключая определенные папки.

Я пытаюсь передать результаты вызова Get-ChildItem через io.compression.zipfile, чтобы создать zip-файл «E: \ Applications_Server_Test», за исключением двух папок «BACKUP» и «BACKUP2».

Однако Powershell, похоже, интерпретирует это как «$ items = строка каталогов и имен файлов» вместо рекурсивного набора каталогов и файлов, которые я хочу заархивировать. Я могу найти учебные пособия по использованию Get-ChildItem для исключения каталогов, и я могу найти учебные пособия о том, как заархивировать полный каталог или заархивировать несколько каталогов, но я не могу найти ничего по архивированию каталогов с исключениями. Может кто-нибудь сказать мне, где я ошибаюсь?

$source = "E:\Applications_Server_Test"
$destination = "E:\AST_Dump.zip"

$items = Get-ChildItem $source -Recurse | ?{ $_.fullname -notmatch "\\backup\\?" }

Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::CreateFromDirectory($items, $destination)

Спасибо!


person Tristan V    schedule 24.08.2016    source источник
comment
См. Архивирование только файлов с помощью PowerShell   -  person wOxxOm    schedule 24.08.2016
comment
У меня есть 6 каталогов и 2 файла в этой корневой папке Applications_Server_Test. BACKUP BACKUP2 DIR1 DIR2 DIR3 DIR4 Genericfile.txt Genericfile.dat Я исключаю только две папки BACKUP, но мне все еще нужны другие четыре папки, любые рекурсивные файлы и папки и два файла корневого уровня. Я хотел бы упаковать оставшиеся файлы и папки в один zip-файл с помощью Powershell. Есть ли у меня единственные варианты: либо символически связать все, что я хочу, где-то еще, и упаковать это, либо создать один .zip для каждой папки?   -  person Tristan V    schedule 24.08.2016


Ответы (1)


В настоящий момент вы пытаетесь заархивировать объект $ items, а не папку. К сожалению, это не сработает. Попробуйте переместить папки с резервными копиями на тот же диск (это просто изменит записи на диске и не переместит никакие данные), затем заархивируйте всю папку «E: \ Applications_Server_Test» и переместите обратно папки с резервными копиями.

Другой вариант - использовать ZipArchive.CreateEntry < / em> и добавить файл за файлом в архив. Но это не так уж и элегантно;)

person autosvet    schedule 24.08.2016
comment
Я думаю, что можно создавать символические ссылки в новой папке для каждого необходимого файла, поэтому нет необходимости фактически копировать файлы. - person wOxxOm; 24.08.2016
comment
Проблема в том, что резервные папки являются частью приложения. Им нужно оставаться на одном месте. Я просто хочу захватить другие файлы и папки в этом корневом каталоге и заархивировать их, оставив только BACKUP и BACKUP2. - person Tristan V; 24.08.2016
comment
Просто используйте символические ссылки в новой папке: примеры - person wOxxOm; 24.08.2016
comment
Я ценю ответ, но это кажется более применимым к исправлению ответа Автосвета, чем к оценке моего вопроса и предложению ответа на него. Создание символических ссылок вместо работы с formattng для вызова Get-ChildItem кажется запутанным. Неужели невозможно рекурсивно перебирать все файлы и папки, кроме двух исключений, и добавлять неисключения в zip-файл? - person Tristan V; 24.08.2016
comment
Если ваша версия ОС и PS поддерживает командлет Compress-Archive (PS 4.0 и Win 8.1, если я хорошо помню), вы можете использовать его: $items |ForEach-Object {Compress-Archive $_.FullName -DestinationPath $destination} В противном случае необходимо создать аналогичный цикл с методом ZipArchive.CreateEntry, который я упоминаю в ответе. - person autosvet; 24.08.2016