Автоматически извлекать и переименовывать извлеченный файл в соответствии с именем архива

Автоматически извлекать и переименовывать извлеченный файл в соответствии с именем архива

У меня есть куча zip-файлов в папке. Каждый zip-файл содержит файл с именем exp_1.txt. Я хотел бы распаковать каждый zip-файл и переименовать извлеченный файл из каждого zip-файла в то, как был назван zip-файл.

Имена zip-файлов не следуют какому-либо шаблону или структуре даты, но все они разные. Я выяснил, как извлечь файл exp_1.txtв тот же каталог, что и zip-файл, но не могу понять, как переименовать, exp_1.txtчтобы он соответствовал названию zip-файла, из которого он был извлечен.

Еще раз короче: из архива TuesdayReport.zipя хочу извлечь единственный файл exp_1.txtи переименовать его TuesdayReport.txtв тот же каталог, что и TuesdayReport.zip.

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

решение1

почему бы не использовать 7zip command line edition, который можно скачать сздесь?

Внутри этого zip-файла вы найдете файл справки в формате CHm, содержащий все переключатели и команды, которые могут помочь вам в процессе пакетной обработки.

решение2

forfiles /M *.zip /C "cmd /c C:\PROGRA~1\7-Zip\7z.exe e @file & ren exp_1.txt @fname.txt"

решение3

Это позволит извлечь указанный файл exp_1.txtиз каждого zip-файла в текущем каталоге с таким же именем, как у zip-файла, но с txtрасширением zip:

for %a in (*.zip) do @(7z l "%~a" -ir!exp_1.txt |findstr exp_1.txt) && 7z e "%~a" -ir!exp_1.txt -so >"%~na.txt"

Это должно быть запущено непосредственно из командной строки, если вы хотите запустить его из пакетного режима, вам нужно будет дважды%

Что оно делает:

  • forцикл перечисляет каждый zip-файл
  • первый 7zвызов вместе с findstrобеспечивает запуск извлечения/создание файла только в том случае, если архив содержит определенный файл
  • Второй 7zвызов фактически извлекает файл в стандартный вывод ( -soswitch) и перенаправляет stdout в файл с тем же именем, что и архив (без расширения). Модификатор %~nуказывает cmd принимать только базовое имя (без расширения)

Обратите внимание, что если в архиве находится более одного файла с одинаковым именем (в разных каталогах), то это может привести к неожиданным результатам.

Если вы помещаете его в пакет, то я бы также предложил установить имя файла как переменную (перед петлей), чтобы избежать ошибок, связанных с повторением (вам нужно ввести его 3 раза в команде выше).

Связанный контент