Ваш оригинальный скрипт делает следующее, строка за строкой:
@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
Когда сценарий завершен, это ключевое слово просто говорит оболочке подождать, пока вы нажмете ввод или закроете командную строку вместо немедленного выхода из нее.
Когда вы создаете пакетный сценарий (или, вообще, все, что связано с кодом), вы должны прекратить рассматривать весь сценарий как монолитную копию-вставку, которую вы не пытаетесь понять, и вместо этого разбить свой проблема в части, которые вы можете выяснить индивидуально, а затем соединить их вместе. Это позволит вам самостоятельно решать проблемы и создавать решения, а не просить кого-то делать всю вашу работу за вас. Я очень рекомендую это.
В вашем случае у вас есть следующие подкомпоненты вашей проблемы:
- Выполните итерацию (обход) каждого файла, содержащегося в данном каталоге.
- Для каждого данного файла поместите его в файл .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
.)