8

Поэтому я пытаюсь использовать 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-архив разделял имя файла, за исключением расширения, конечно.

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

2 ответа2

3

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

@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 .)
3

Я хочу, чтобы у каждого файла был свой собственный 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"

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

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