У меня есть куча 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
вызов фактически извлекает файл в стандартный вывод (-so
switch) и перенаправляет stdout в файл с тем же именем, что и архив (без расширения). Модификатор%~n
указывает cmd принимать только базовое имя (без расширения)
Обратите внимание, что если в архиве находится более одного файла с одинаковым именем (в разных каталогах), то это может привести к неожиданным результатам.
Если вы помещаете его в пакет, то я бы также предложил установить имя файла как переменную (перед петлей), чтобы избежать ошибок, связанных с повторением (вам нужно ввести его 3 раза в команде выше).