Извлечь 7-почтовые файлы в каталог, в котором они находятся?

У меня есть каталог c:7zip est , содержащий много подкаталогов, некоторые из которых содержат 7-zip файлы.

Я хочу найти и извлечь 7-почтовые файлы в их каталоги хранения из пакетного файла, а затем удалить эти 7-почтовые файлы.

@If "%1"=="" (Set pathf=c:7zip	est) else (Set pathf=%1) 
@If "%2"=="" (Set lzma2_test=*.7z) else (Set lzma2_test=%2)

for /r "%pathf%" %%f in ("%lzma2_test%") do 7z x -y -mx1 -m0=lzma2 "%%f" -oFolderName
del "%pathf%" + subfolder name (if needed) + 7-zip file name

Вместо FolderName я должен отправить имя каталога, но я не знаю как. И то же самое для del .

Всего 1 ответ


Откройте командную строку , запустите for /? и прочитайте справку по выводу от верхней части первой страницы до нижней части последней страницы, особенно раздел о ссылках на переменную цикла с модификатором, подобным %~dpI где I - переменная цикла для ссылки на диск и путь.

@echo off
if "%~1" == "" (set "pathf=c:7zip	est") else (set "pathf=%~1")
if "%~2" == "" (set "lzma2_test=*.7z") else (set "lzma2_test=%~2")

for /R "%pathf%" %%I in ("%lzma2_test%") do (
    7z.exe x -y -o"%%~dpI" "%%I"
    if not errorlevel 1 del "%%I"
)

-mx1 -m0=lzma2 сжатия -mx1 -m0=lzma2 бесполезны при извлечении архива. Архив содержит в заголовке алгоритм, используемый для сжатия, поэтому извлечение работает всегда, если используемый 7z.exe поддерживает тип архива и используемый алгоритм для создания архива.

Архивный файл удаляется только в том случае, если извлечение 7x.exe успешно, то есть 7x.exe не со значением, большим или равным 1 что означает равное 0 что является кодом выхода для успешного извлечения.

Было бы более безопасно использовать следующий код, который также работает, если файл архива содержится внутри другого файла архива. Этот код рекомендуется также для использования на дисках FAT16, FAT32 или exFAT.

@echo off
if "%~1" == "" (set "pathf=c:7zip	est") else (set "pathf=%~1")
if "%~2" == "" (set "lzma2_test=*.7z") else (set "lzma2_test=%~2")

for /F "eol=| delims=" %%I in ('dir "%pathf%\%lzma2_test%" /A-D /B /S 2^>nul') do (
    7z.exe x -y -o"%%~dpI" "%%I"
    if not errorlevel 1 del "%%I"
)

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

Было бы неплохо сначала протестировать использованный пакетный файл, запустив его из окна командной строки с echo оставленным для 7z.exe и, if not errorlevel 1 посмотреть, что будет выполнено без if not errorlevel 1 его выполнения.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • call /?
  • del /?
  • dir /?
  • echo /?
  • for /?
  • if /?
  • set /?

Прочитайте статью Microsoft об использовании операторов перенаправления команд для объяснения 2>nul . Оператор перенаправления > должен быть экранирован символом вставки ^ в командной строке FOR, чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR, которая выполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме с %ComSpec% /c и командная строка между ' добавляются в качестве дополнительных аргументов.


Есть идеи?

10000