Ваш оригинальный скрипт делает следующее, строка за строкой:
@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
подсказки.)