7zip создание пустых архивов с командным файлом - PullRequest
1 голос
/ 11 марта 2020

Я хочу сжать все в папке, ВСЕ, но в индивидуально названные архивы. По какой-то причине каждое решение для inte rnet только архивирует папки или вообще не работает.

В настоящее время у меня есть

for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%X.zip" "%%X\"

, что я интерпретирую как

  • for = инициировать все oop
  • /d = Я не знаю, что это значит
  • %%X = Я не знаю, что это значит
  • in = не уверен, я думаю, что это означает текущий каталог
  • (*) = Я не знаю, что это значит
  • do = выполнить следующее вещь в " ... "
  • "C:\Program Files\7-Zip\7z.exe" = вещь, которую я хочу сделать.
  • a = добавить в архив
  • -m9 = максимальное сжатие
  • "%%X.zip" = сделать его zip-файлом, хотя я до сих пор не знаю, что такое %%X.
  • "%%X\" = даже если бы я знал, что "%% X \ "означает, что я не знаю, почему он здесь.

Я выяснил, что замена %%X дает архиву имя, поэтому, похоже, оно копирует имя объекта, на который нацелено.

Так что, если я угадаю, я думаю, /d - это «целевые папки», а %%X - это имя.

Итак

for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%X.zip" "%%X\"

Говорит по-английски sh, насколько я понимаю: для каждого имени папки в текущем каталоге используйте 7z, чтобы максимально сжать его в zip с тем же именем. .. кроме того, что я не знаю, что заменить /d, чтобы сделать его целевыми файлами вместо папок. А нацеливание на конкретные c расширения было бы еще лучше.

Я пробовал поискать в Google, что означает "/d в cmd", "что означает %%X" и т.д. c. Похоже, я не получаю правильных результатов в поиске, я думаю, что я слишком расплывчат для Google.

ОБНОВЛЕНИЕ:

for %%i in (*) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%i.zip" "%%i\*.*"

, кажется, создает zip-файл NAMED каждый элемент в папке, но фактически не добавляет к ним никаких файлов. Я попытался добавить /f, но когда я это сделал, он вообще не работал.

Кроме того, когда я впервые опубликовал это, он был закрыт как дубликат Пакетный скрипт l oop , который почти не имеет отношения к моей проблеме. Да, у меня есть все oop, да, это относится к пакетным циклам, но нет, это не приближается к решению моей проблемы, так как моя проблема не связана с самим l oop., Или если это так, у меня нет абсолютно никаких Идея почему или как. Поэтому, пожалуйста, объясни мне это. Я видел раздел, где говорится, что %%X - это переменная, но это просто означает, что я предполагаю, что X может быть любым, чем я хочу, и, поскольку в моем обновлении я указал на вторичную проблему, я думаю, что проблема у меня возникла с 7z, а не с файлом bat.

1 Ответ

0 голосов
/ 11 марта 2020

Поначалу команда for может очень сбить с толку, однако есть много видео и сайтов, на которых показаны примеры ее использования. Для начала попробуйте for /?, чтобы увидеть встроенную справочную информацию.

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

for /F "tokens=*" %%a in ('DIR /A-D /B /ON "C:\Test Folder\"') do (
    echo Processing File: C:\Test Folder\%%a
    "C:\Program Files\7-Zip\7z.exe" a -mx1 -tzip "C:\Test Folder\%%a.zip" "C:\Test Folder\%%a"
    echo.
)
pause

Теперь пропускаем go через него строка за строкой ...

for /F "tokens=*" %%a in ('DIR /A-D /B /ON "C:\Test Folder\"') do (

/F Говорит, чтобы он работал вместо files из directories (/D)

in (' ') Содержит команду, которая находит имена файлов. Обратите внимание на отметки ' на каждом конце команды ... они важны.

%%a Представляет каждое значение имени файла, которое передается командой in().

do ( ) Что он должен делать с каждым полученным значением %%a.


Теперь мы переходим к команде, которая находит имена файлов и передает в раздел do () как %%a

('DIR /A-D /B /ON "C:\Test Folder\"')

Подробнее об этом можно узнать, запустив dir /?

/A-D Указывает игнорировать каталоги ... только файлы списка.

/B Вывод только имена файлов, а не что-либо еще, например размеры, или это может привести к путанице в команде for.

/ON Передать имена файлов в команду do() в алфавитном порядке

"C:\Test Folder\" Папка, которая содержит все файлы, которые мы хотим перечислить / выполнить действия. Удостоверьтесь, что вы включили конечный знак sh. Также используйте метки "" или не будет работать, если в имени папки есть пробел.


Записать (эхо) на экран сообщение, показывающее, какой файл он собирается сделать.

echo Processing File: C:\Test Folder\%%a

Более подробную информацию об использовании функций командной строки 7zip можно найти по адресу https://sevenzip.osdn.jp/chm/cmdline/syntax.htm

"C:\Program Files\7-Zip\7z.exe" a -mx1 -tzip "C:\Test Folder\%%a.zip" "C:\Test Folder\%%a"

"C:\Program Files\7-Zip\7z.exe" Запустите эту программу. ... и передать ему следующую информацию (аргументы / переключатели)

a Добавлять файлы, а не извлекать, et c.

-mx1 Использовать самый быстрый метод сжатия .. .но меньше места.

-tzip Используйте формат сжатия ZIP

"C:\Test Folder\%%a.zip" Сохраните новый файл "zip" как этот. (%%a будет заменено именем текущего файла ... aka ChuckNorris.mpg, который в конечном итоге будет называться ChuckNorris.mpg.zip)

"C:\Test Folder\%%a" Это фактический файл, который вы хотите сжать .

...