Использование командного файла для архивирования файлов в виде отдельных файлов ZIP

10

Поэтому я пытаюсь использовать 7zip в пакетном файле, чтобы взять файлы в папке и сжать их как отдельные файлы. Таким образом, первый файл получает свой собственный zip-архив, а следующий и так далее. Я искал в интернете и пробовал кучу разных кодов. До сих пор мне удалось только успешно заархивировать их как один zip-файл и вывести их на мой рабочий стол.

К сожалению, я потерял код, который сделал это, и теперь я застрял с этим, который, кажется, ничего не делает.

@echo on
cd "C:\Users\MVD21\Desktop\test"
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
pause

Я хочу, чтобы каждый файл имел свой собственный zip-архив, и чтобы zip-архив разделял имя файла, за исключением расширения, конечно.

Любая помощь с благодарностью.

Майк Ван Данк
источник
Также, если есть более простой способ сделать это, используя встроенную функцию zip в Windows 10, это также подойдет.
Майк Ван Данк

Ответы:

4

Я хочу, чтобы каждый файл имел свой собственный zip-архив, и чтобы zip-архив разделял имя файла, за исключением расширения, конечно.

Пакетный скрипт

(Установите полные явные пути к исходным и целевым папкам вверх, а затем просто запустите их по мере необходимости. В источнике находятся файлы, которые вы хотите заархивировать, а в месте назначения вы хотите, чтобы эти файлы были сжаты.)

@ECHO ON

SET SourceDir=C:\folder\source
SET DestDir=C:\folder\destination

CD /D "C:\Program Files\7-Zip"
FOR /F "TOKENS=*" %%F IN ('DIR /B /A-D "%SourceDir%"') DO (
    7z.exe a "%DestDir%\%%~NF.zip" "%SourceDir%\%%~NXF"
)
EXIT

Командная строка

FOR /F "TOKENS=*" %F IN ('DIR /B /A-D "C:\Folder\Source"') DO 7z.exe a "C:\Folder\Dest\%~NF.zip" "C:\Folder\Source\%~NXF"

Дополнительные ресурсы

Сок Pimp IT
источник
4

Ваш оригинальный скрипт делает следующее, строка за строкой:

@echo on

Сообщает командной строке распечатать каждую команду в командном файле перед ее выполнением. Это просто, чтобы вы могли «увидеть», что он действительно делает, прежде чем он это сделает.

cd "C:\Users\MVD21\Desktop\test"

C hanges D irectory в то , что я надеюсь , что это путь , по которому вы хотите заархивировать все файлы.

FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"

Параметр INздесь есть (C:\Users\MVD21\Desktop\test). Это приведет к тому, что цикл «тело» (действие за ключевым словом DO) будет выполнен ровно один раз , а %iпараметру будет присвоено значение C:\Users\MVD21\Desktop\test. Не удивительно, что это не делает то, что вы хотите! Похоже, это заархивирует весь каталог в один файл .7z.

Если он ничего не делает , это, вероятно, потому что он не может найти путь 7z.exe. Если этот файл не находится в текущем каталоге ( testуказанном выше), он должен быть в PATH%PATH%переменной окружения; попробуйте echo %PATH%в оболочке, чтобы увидеть, что он установлен в данный момент). В противном случае вам придется скопировать 7z.exeв текущий каталог или указать абсолютный путь к его местоположению (например, например "C:\Program Files\7-zip\7z.exe" ...).

pause

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


Когда вы создаете пакетный скрипт (или, действительно, все остальное, что связано с кодом), вы должны прекратить рассматривать весь скрипт как монолитную копию-вставку, которую вы не пытаетесь понять, и вместо этого разбить свой проблема в части, которые вы можете выяснить индивидуально, а затем соединить их. Это позволит вам самостоятельно решать проблемы и создавать решения, а не просить кого-то делать всю вашу работу за вас. Я очень рекомендую это.

В вашем случае у вас есть следующие подкомпоненты вашей проблемы:

  1. Выполните итерацию (обход) каждого файла, содержащегося в данном каталоге.
  2. Для каждого данного файла поместите его в файл .7z, вызвав 7zутилиту.

Вероятность того, что у кого-то уже есть ответ, который решит ваши конкретные потребности, меньше, чем возможность найти более общие элементы по отдельности.

Этот вопрос «Как сделать что-то для каждого файла в каталоге в пакетном скрипте» решает половину вашей проблемы.

Суть ответа в том, что вы просто начинаете с этой части из ответа StackOverflow:

for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f

и измените часть, где он делает что-то ( echo %%f), чтобы делать то, что вы хотите сделать . Я знаю, что вам нужно изменить эту часть, потому что я проанализировал текст скрипта и понял, что означает каждый символ и параметр, поэтому я могу подумать, куда я хочу вставить свой собственный код.

Вот некоторый «воздушный кодекс» (не проверенный!):

for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"

Приведенные выше операторы @echo onи pauseявляются хорошей практикой, поэтому вы можете оставить их внутри. И вы, вероятно, захотите оставить это cdутверждение также, если ваши файлы расположены по этому пути.

Так что же это оставляет нас?

@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause

Если вы ответите «Это не работает!», Я НЕ БУДУ вам помочь. Если вы попробуете это, и это не сработает, вы ДОЛЖНЫ сообщить мне в комментариях следующую информацию:

  • Какое точное сообщение об ошибке вы получаете в командной строке, когда вы запускаете эти команды или помещаете их в командный файл и запускаете их? Не сокращайте; скопируйте и вставьте вывод напрямую (поместите его на http://pastebin.com, если его много).
  • Как вы думаете, что сообщение об ошибке говорит вам, что проблема?
  • Где находится ваша установка 7-zip (путь к файлу)?
  • Включено ли расположение файла вашей 7-zip-инсталляции в содержимое PATHпеременной среды? (отметьте это, как указано выше, с echo %PATH%помощью cmdподсказки.)
allquixotic
источник
Я не думаю, что это работает, потому что у меня установлен 7zip на другом диске? Кажется, работает, если я делаю CD "Расположение 7zip", как в оригинальном ответе. Конечно, это работает только «иногда». Это работало до тех пор, пока я не вставил в него еще одно эхо-выражение, а теперь это не так И да, я пытаюсь понять больше о пакетных файлах. Я пытался найти глоссарий командных команд или что-то, что не нужно изучать, поэтому я действительно понимаю это. Поверь мне, я бы лучше понял, И это сработало, чем сработало.
Майк Ван Данк
Я попробовал ваше решение, и я не могу сказать вам, что вывод, потому что пакетный файл не запускается вообще. Он ненадолго открывается с окном cmd, а затем снова закрывается. Да, у меня есть пауза там. У меня установлен 7zip как на локальном диске, так и на дополнительном внутреннем диске, но он не является частью среды пути
Майк Ван Данк
Я бы очень хотел понять, но поиск в Google не очень помогает. Например, я понятия не имею, что это за команда или параметр "dir / b" или что она делает. Я знаю, что каталог, очевидно, является каталогом, но я не знаю, что такое / b. Я хотел бы, чтобы кто-то объяснил, что делают параметры, чтобы я мог лучше понять. Или, если у кого-то есть ссылка на сайт, где они просматривают подобные вещи, это также будет полезно. Я погуглил dir / b в командном файле и не смог ничего найти. Я думаю, что / b имеет отношение к именам файлов, но я не уверен.
Майк Ван Данк