Войти

Показать полную графическую версию : Распаковка с переименованием.


Павел_Будков@vk
28-01-2015, 20:39
Здравствуйте.
Помогите решить такую задачку -
Имеется много 7z архивов в них по несколько файлов с одинаковым расширением .smg
Нужно распаковать или переименовать в самих архивах все файлы по типу имя_папки.smg или имя_папки_цифровой счетчик.smg

Для zip и rar я просто делал for %%i in (*.zip) do "%ProgramFiles%\WinRar\winrar.exe" rn "%%i" "*.smg" "%%~ni.smg"
но с 7z это не прокатывает.

И еще может подскажите, как упаковать содержимое папок, именно их содержимого, а не чтобы в архиве была папка с содержимым, т.е. каждая папка это отдельный архив с именем этой папки и ее содержимым.
Спасибо.

iccup.platoon@vk
28-01-2015, 23:11
1) Все архивы находятся в одной папке?
2) Я выбрал вариант "распаковать". Куда их распаковать? Что я должен сделать с файлами после распаковки?
=-=-=-=-=-=-=-=-=-=-=-=-=
VМожет, так?

@echo off
SetLocal enabledelayedexpansion
set ProgaZip="ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ_7z.exe"
:: директория для упаковки
set dr="ПУТЬ_К_ПАПКЕ_В_КОТОРОЙ_ВСЁ_БУДЕТ_УПАКОВАНО"
:: имя полученного архива
set arh=ЗАМЕНИТЬ_НА_СВОЕ_ИМЯ.7z
:: сжатие максимальное в LZMA2
"%ProgaZip%" a "%arh%" "%dr%" -m0=LZMA2 -mx=9 -mmt=2

Павел_Будков@vk
29-01-2015, 01:00
Все архивы в одной папке, распаковать тоже в эту же папку с архивами. После распаковки ничего, главное чтобы распаковывались все файлы .smg с именами своих архивов.

iccup.platoon@vk
29-01-2015, 22:01
Тогда так.

@echo off
setlocal enabledelayedexpansion
set path="ПУТЬ К ПАПКЕ С АРХИВАМИ_СО_СЛЕШЕМ \"

for %%a in (%path%*.7z) do (
start "" /wait "ПУТЬ_К_7z.exe" x "%%a" -o"%path%"
)
endlocal
exit /b

Писал по памяти, не обессудьте, но сработать должно.

gora
30-01-2015, 21:27
Имеется много 7z архивов в них по несколько файлов с одинаковым расширением .smg
Нужно ... переименовать в самих архивах все файлы по типу ... имя_папки_цифровой счетчик.smg »
@Echo Off
SetLocal enabledelayedexpansion
Set folder=e:\Temp 1\22
Set ext=smg

For /F "tokens=* delims=" %%i In ('dir /S /A:-D /B "%folder%\*.7z" 2^>Nul') Do (
Set cnt=0
For /F "tokens=*" %%a In ('7z l -ba "%%i"') Do (
Set /a cnt += 1
Set ta=%%a
If /I "!ta:~-3!"=="%ext%" 7z rn "%%i" "!ta:~53!" "%%~ni!cnt!.%ext%"
)
)

Павел_Будков@vk
02-02-2015, 00:30
Спасибо, большое за помощь.

Павел_Будков@vk
02-02-2015, 08:07
Если можно подскажите, как подправить этот код

@Echo Off
SetLocal enabledelayedexpansion
Set folder=e:\Temp 1\22
Set ext=smg

For /F "tokens=* delims=" %%i In ('dir /S /A:-D /B "%folder%\*.7z" 2^>Nul') Do (
Set cnt=0
For /F "tokens=*" %%a In ('7z l -ba "%%i"') Do (
Set /a cnt += 1
Set ta=%%a
If /I "!ta:~-3!"=="%ext%" 7z rn "%%i" "!ta:~53!" "%%~ni!cnt!.%ext%"
)
)
чтобы он не пропускал названия содержащие восклицательные знаки, в архивах довольно много вот такого рода имен техт!.smg , и все файлы с восклицательным знаком не меняют имена, просто игнорируются. Как быть?

Спасибо.

Georgio
02-02-2015, 14:12
Как быть? »



Вам нужно убрать включение отложенного расширения переменных ("setlocal enabledelayedexpansion") в начале кода, а затем попробовать варианты:

1) запускать команду в новом процессе с включённым отложенным расширением: cmd /v:on /c "If /I "!ta:~-3!"=="%ext%" 7z rn "%%i" "!ta:~53!" "%%~ni!cnt!.%ext%"";

2) использовать в команде модификатор "~x" и двойное расширение переменных: If /I "%%~xa"==".%ext%" call 7z rn "%%i" "%%ta:~53%%" "%%~ni%%cnt%%.%ext%";

3) можно вынести данную команду в отдельную процедуру.


Работоспособность вариантов не проверял, так как на данный момент у меня архиватор "7-Zip" не установлен.


Примечание: модификатор "~x" отделяет от значения переменной цикла или параметра последнюю точку и все символы, идущие за ней, даже если они не имеют никакого отношения к реальноиу файлу. Например, результатом выполнения в командной строке команды for /f %i in ("*|<.>?|") do @echo %~xi будет .>?| (этими символами не могут быть только оба слеша и двойные кавычки).

Павел_Будков@vk
02-02-2015, 14:36
Спасибо за помощь, очень выручили!
Теперь все работает, как надо!




© OSzone.net 2001-2012