3

Я бы хотел, чтобы PowerShell архивировал содержимое нескольких папок и получал отдельный ZIP-файл для каждой папки. Недавно я спросил, как это сделать с помощью файла .bat, и я получил ответ.

for /D %%d in (*.*) do "C:\Program Files\7-Zip\7z\7za.exe" a -tzip %%d.zip %%d

Однако это оказалось полезным только для папок, в имени которых нет пробелов. Причина в том, что пакет будет делать следующее: если имя папки «Джефф в отпуск», переменные будут:

%%d = Jeff's<br>
%%e = vacation<br>
%%f = pictures<br>

Затем он пытается передать только %%d программе 7-Zip, которая не найдет такую папку и, следовательно, не создаст ZIP-файл.

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

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

Итак, вот что у меня есть, но оно не работает, вероятно, из-за моей общей неопытности в PowerShell:

function zipFolders($parent) {
    $zip = "C:\Program Files\7-Zip\7z\7za.exe";
    $parents | ForEach-Object $zip a -tzip
}

1 ответ1

4

Вам нужно дать 7-Zip имя выходного файла и имя входного каталога, чтобы он работал. Вы также хотите вызвать Get-ChildItem (dir) для родительского пути, чтобы получить его подпути.

Следующий фрагмент должен поместить каждую подпапку $rootFolder в ZIP-файл с максимальным сжатием, названный в честь подпапки в текущем пути.

dir $rootFolder | Where-Object { $_.PSIsContainer } | ForEach-Object { C:\"Program Files"\7-zip\7z.exe a -mx9 "$_.zip" $_.FullName }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .