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

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

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

@If "%1"=="" (Set pathf=c:\7zip\test\) 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 Ответ

1 голос
/ 12 февраля 2020

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

@echo off
if "%~1" == "" (set "pathf=c:\7zip\test") 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 бесполезны при извлечении архива. Архив содержит в заголовке алгоритм, используемый при сжатии, поэтому извлечение работает всегда, если используется 7z.exe, поддерживающий тип архива и используемый алгоритм при создании архива.

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

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

@echo off
if "%~1" == "" (set "pathf=c:\7zip\test") 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, чтобы увидеть, что будет выполнено без реального его выполнения.

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

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

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

...