Как написать пакетный файл, который может распаковать файл в новую папку с тем же именем?

Мне нужно написать пакет script, который позволит мне распаковать ZIP файл в новую папку с тем же именем, что и zip файл. Я не могу предположить, что у меня есть программа для распаковки файла; он должен работать так, как будто компьютер совершенно новый.

Например, если у меня есть группа zip файлов с именами a1, b2, c3 и d4, я хочу, чтобы их содержимое перешло в 4 разных папки с метками a1, b2, c3, d4. Он не должен быть кратким, он просто должен работать.

Ответ 1

Прочитать отличную тему Как сжать (zip) и распаковать (распаковать) файлы и папки с помощью пакетного файла без использования каких-либо внешних инструментов?, написанный npocmaka.

Я предлагаю использовать второе решение: Использование Shell.Application

Задачу можно выполнить с помощью zipjs.bat, также написанного npocmaka с командным файлом всего несколькими строками:

@echo off
for %%I in (*.zip) do call "%~dp0zipjs.bat" unzip -source "%%~fI" -destination "%%~dpnI\" -force yes
for /F "delims=" %%D in ('dir /AD /B "%TEMP%\*.zip" 2^>nul') do (
    %SystemRoot%\System32\attrib.exe -h "%TEMP%\%%~D"
    rd /S /Q "%TEMP%\%%~D" 2>nul
)

Гибкий командный файл zipjs.bat должен находиться в той же папке, что и командный файл с двумя строками выше.

Запуск в окне командной строки call /? объясняет %~dp0, что означает диск и путь аргумента 0 командного файла без окружающих кавычек, заканчивающихся всегда обратным слэшем. Аргумент 0 вызываемого командного файла - это имя командного файла, см. Также Что означает% ~ dp0 и как оно работает?

Справка команды для, отображаемая при запуске в окне командной строки for /?, объясняет

  • %%~fI - полное имя файла/папки без окружающих кавычек и
  • %%~dpnI - диск, путь и имя файла/папки без окружающих кавычек и без расширения

для переменных цикла, таких как call /?, для параметров/аргументов партии.

Второй цикл для находит все подкаталоги в каталоге для временных файлов с .zip в имени каталога, удаляет скрытый атрибут и удаляет эти подкаталоги. Это необходимо, поскольку zipjs.bat сначала извлекает каждый файл во вновь созданный подкаталог в каталоге для временных файлов и оставляет их там после успешного извлечения.