Показать полную графическую версию : [решено] Сложное пакетное переимеонование
Aleksander.Ruban@fb
25-08-2012, 08:07
Прошу помочь!
Есть директория, в ней около ста папок с именами, в которых присутствуют либо "EUR", либо - "MULTIX" (где X - цифры от 1 до 9), либо - "USA".
Внутри папок файлы с расширением "cso".
Теперь сама просьба:
- необходимо переименовать эти файлы с расширением "cso" согласно имени папки, которое необходимо обрезать до символов "EUR" (или "MULTIX" или "USA") включительно. Одновременно убрав из имени файла знаки подчеркивания.
Например, имеем:
Директорию "2007" с папкой "Burnout_Dominator_EUR_PSP-pSyPSP" и файлом "psy-boe.cso". Хотим получить имя файла хотя бы такого вида:
Burnout Dominator EUR.cso
Если возможно, то еще пару пожеланий:
1) Название региона взять в скобки - Burnout Dominator (EUR).cso
2) В каждой папке создать файл - "original_name.txt", в который поместить оригинальное имя дампа - "psy-boe.cso".
Прим. Пересобираю коллекцию. Папок очеееень много.
Заранее благодарен.
Foreigner
25-08-2012, 09:39
Aleksander.Ruban@fb,
Попробуй:
@echo off
setlocal
pushd "C:\2007" || goto:eof
for %%i in (EUR MULTI USA) do (
for /f "tokens=*" %%j in ('dir /b /ad *%%i*') do call:1 %%i "%%j"
)
popd
goto:eof
:1
set "name=%~2"
set "name=%name:EUR=?%"
set "name=%name:MULTI=?%"
set "name=%name:USA=?%"
for /f "tokens=1 delims=?" %%i in ("%name%") do set "name=%%i(%1)"
ren "%~2\psy-boe.cso" "%name:_= %.sco"
Если название файла sco заранее не известно, то можно заменить последнюю строчку на:
for %%i in ("%~2\*.sco") do (
ren "%%i" "%name:_= %.sco"
1>"%~2\orig_name.txt" echo %%~nxi
)
Aleksander.Ruban@fb
25-08-2012, 12:01
@echo off
setlocal
pushd "C:\2007" || goto:eof
for %%i in (EUR MULTI USA) do (
for /f "tokens=*" %%j in ('dir /b /ad *%%i*') do call:1 %%i "%%j"
)
popd
goto:eof
:1
set "name=%~2"
set "name=%name:EUR=?%"
set "name=%name:MULTI=?%"
set "name=%name:USA=?%"
for /f "tokens=1 delims=?" %%i in ("%name%") do set "name=%%i(%1)"
ren "%~2\psy-boe.cso" "%name:_= %.sco"
»
Отлично! Только в последней строке (ren "%~2\psy-boe.cso" "%name:_= %.sco") надо сменить %.sco на %.cso.
Но не понял, как заставить работать скрипт, если имя файла неизвестно.
В таком варианте:
@echo off
setlocal
pushd "C:\2007" || goto:eof
for %%i in (EUR MULTI USA) do (
for /f "tokens=*" %%j in ('dir /b /ad *%%i*') do call:1 %%i "%%j"
)
popd
goto:eof
:1
set "name=%~2"
set "name=%name:EUR=?%"
set "name=%name:MULTI=?%"
set "name=%name:USA=?%"
for /f "tokens=1 delims=?" %%i in ("%name%") do set "name=%%i(%1)"
for %%i in ("%~2\*.sco") do (
ren "%%i" "%name:_= %.sco"
1>"%~2\orig_name.txt" echo %%~nxi
)
»
После запуска перименование не происходит.
Еще вопрос в первом варианте скобка ")" в конце нужна?
Прим. Сейчас узрел ошибки cso-sco. Подправлю отпишусь.
Foreigner
25-08-2012, 12:05
После запуска перименование не происходит.
Еще вопрос в первом варианте скобка ")" в конце нужна? »
Может тоже cso. Скобка нужна
Aleksander.Ruban@fb
25-08-2012, 12:23
В таком варианте работает.
@echo off
setlocal
pushd "C:\2007" || goto:eof
for %%i in (EUR MULTI USA) do (
for /f "tokens=*" %%j in ('dir /b /ad *%%i*') do call:1 %%i "%%j"
)
popd
goto:eof
:1
set "name=%~2"
set "name=%name:EUR=?%"
set "name=%name:MULTI=?%"
set "name=%name:USA=?%"
for /f "tokens=1 delims=?" %%i in ("%name%") do set "name=%%i(%1)"
for %%i in ("%~2\*.cso") do (
ren "%%i" "%name:_= %.cso"
1>"%~2\orig_name.txt" echo %%~nxi
)
Но один из файлов в orig_name.txt переносится не в оригинальном виде, а в виде имени уже переименованого файла.
Например, вместо "su-frantix.cso" в orig_name.txt записалось "Frantix.(EUR).cso". Кстати, сам файл переименован в "Frantix.(MULTI).cso". Точка перед (MULTI) и (EUR) лишняя, да и почему нессотвествие (MULTI) и (EUR)? В остальных случаях в orig_name.txt записались исходные (правильные, не переименованные) имена. Проверил несколько раз - всегда один из файлов неверно записывается в orig_name.txt. Проблема в том, что непонятно в какой именно... Переименование происходит не по алфавиту.
И еще скрипт в конце (перед закрытием) заканчивается выводом сообщения "file not found"
Foreigner
25-08-2012, 13:06
Я не смог повторить, у меня все нормально. Сделайте листинг тестовой директории:
dir /b /s c:\2007\*.cso > file.txt
И выложите. Может какие-нибудь проблемы в названиях?
Aleksander.Ruban@fb
25-08-2012, 13:27
Удалено. Дубль сваял.
Aleksander.Ruban@fb
25-08-2012, 13:52
Листинг
До переименования
c:\2007\Aces_of_War_EUR_PSP-CONFLiCT\cft-aofw.cso
c:\2007\Activision_Hits_Remixed_EUR_PSP-DARKFORCE\dfc-ahre.cso
c:\2007\Archer_Macleans_Mercury_PSP_MULTI5-ELK\CoW-mercury.cso
c:\2007\Bomberman.EUR.PSP-PGS\pgs-bom.cso
c:\2007\Brunswick_Pro_Bowling_EUR_PSP-OE\oe-bruns.cso
c:\2007\Championship_Manager_EUR_PSP-pSyPSP\psy-cm.cso
c:\2007\Coded_Arms_PAL_PSP_MULTI5-WAR3X\wrx-codar.cso
c:\2007\Frantix.EUR.MULTI5.PSP-SUSHi\su-frantix.cso
c:\2007\Namco_Museum_Battle_Collection_Pal_PSP-eLk\c-nmpsp.cso
и после
c:\2007\Aces_of_War_EUR_PSP-CONFLiCT\Aces of War (EUR).cso
c:\2007\Activision_Hits_Remixed_EUR_PSP-DARKFORCE\Activision Hits Remixed (EUR).cso
c:\2007\Archer_Macleans_Mercury_PSP_MULTI5-ELK\Archer Macleans Mercury PSP (MULTI).cso
c:\2007\Bomberman.EUR.PSP-PGS\Bomberman.(EUR).cso
c:\2007\Brunswick_Pro_Bowling_EUR_PSP-OE\Brunswick Pro Bowling (EUR).cso
c:\2007\Championship_Manager_EUR_PSP-pSyPSP\Championship Manager (EUR).cso
c:\2007\Coded_Arms_PAL_PSP_MULTI5-WAR3X\Coded Arms PAL PSP (MULTI).cso
c:\2007\Frantix.EUR.MULTI5.PSP-SUSHi\Frantix.(MULTI).cso
c:\2007\Namco_Museum_Battle_Collection_Pal_PSP-eLk\c-nmpsp.cso
Не переименовался файл в дир-ии Namco_Museum_Battle_Collection_Pal_PSP-eLk - Pal записан нестандартно (можно добавить).
В имени Bomberman.(EUR).cso перед (EUR) затесалась точка.
В папке "c:\2007\Frantix.EUR.MULTI5.PSP-SUSHi\Frantix.(MULTI).cso" в файл "orig_name.txt" вместо "su-frantix.cso" записалось "Frantix.(EUR).cso". Это тестовый набор папок. Я пробовал еще на одном - тоже в один из файлов "orig_name.txt" вместо первоначального имени записалось переименованное.
Вариант 2
c:\2007\AFL_Challenge_EUR_PROPER_PSP-BAHAMUT\b-aflchal.cso
c:\2007\Blood_Bowl_EUR_PSP-ZER0\zer0-bbowl.cso
c:\2007\Cars_Race_o_Rama_EUR_PSP-BAHAMUT\b-carsrorepsp.cso
c:\2007\Cover_Girl_EUR_PSP-iCON\icon-cg-psp.cso
c:\2007\Crystal_Defenders_EUR_PSN_PSP-pSyPSP\psy-cdef.cso
c:\2007\Elementalmonster_TD_Portable_EUR_MULTi5_PSN_PSP-NRP\nrp-emtdpe.cso
c:\2007\Football_Manager_Handheld_2010_EUR_PSP-pSyPSP\psy-fm10.cso
c:\2007\Harry_Potter_and_the_Half-Blood_Prince_EUR_PROPER_PSP-iND\ind-hphpp.cso
c:\2007\Holy_Invasion_of_Privacy_Badman_EUR_PSP-ZER0\zer0-hiopb.cso
c:\2007\King_of_Pool_EUR_PSN_PSP-iND\ind-kop.cso
и после -
c:\2007\AFL_Challenge_EUR_PROPER_PSP-BAHAMUT\AFL Challenge (EUR).cso
c:\2007\Blood_Bowl_EUR_PSP-ZER0\Blood Bowl (EUR).cso
c:\2007\Cars_Race_o_Rama_EUR_PSP-BAHAMUT\Cars Race o Rama (EUR).cso
c:\2007\Cover_Girl_EUR_PSP-iCON\Cover Girl (EUR).cso
c:\2007\Crystal_Defenders_EUR_PSN_PSP-pSyPSP\Crystal Defenders (EUR).cso
c:\2007\Elementalmonster_TD_Portable_EUR_MULTi5_PSN_PSP-NRP\Elementalmonster TD Portable (MULTI).cso
c:\2007\Football_Manager_Handheld_2010_EUR_PSP-pSyPSP\Football Manager Handheld 2010 (EUR).cso
c:\2007\Harry_Potter_and_the_Half-Blood_Prince_EUR_PROPER_PSP-iND\Harry Potter and the Half-Blood Prince (EUR).cso
c:\2007\Holy_Invasion_of_Privacy_Badman_EUR_PSP-ZER0\Holy Invasion of Privacy Badman (EUR).cso
c:\2007\King_of_Pool_EUR_PSN_PSP-iND\King of Pool (EUR).cso
В папках "Cars_Race_o_Rama_EUR_PSP-BAHAMUT" и "Elementalmonster_TD_Portable_EUR_MULTi5_PSN_PSP-NRP" в файлах "orig_name.txt" вместо "b-carsrorepsp.cso" и "nrp-emtdpe.cso" записалось соотвественно "Cars Race o Rama (EUR).cso" и "Elementalmonster TD Portable (EUR).cso".
Может не успевает скрипт, задержка нужна?
Foreigner
25-08-2012, 14:14
Aleksander.Ruban@fb,
Разобрался. Директории, в названиях которых есть и EUR и MULTI и USA одновременно, обрабатываются несколько раз, из-за этого файлы переименовываются тоже несколько раз. Измени последний for
for %%i in ("%~2\*.cso") do (
if not exist "%~2\orig_name.txt" (
ren "%%i" "%name:_= %.cso"
1>"%~2\orig_name.txt" echo %%~nxi
))
ЗЫ. Соответственно c:\2007\Namco_Museum_Battle_Collection_Pal_PSP-eLk\c-nmpsp.cso вообще не обрабатывается, т.к. не соответствует условиям поиска (USA MULTI EUR)
ЗЫЫ. "file not found" если есть директория, в названии которой отсутствуют EUR, MULTI или USA.
Aleksander.Ruban@fb
25-08-2012, 20:11
Спасибо. Вы гений! Все сработало прекрасно: 1050 каталогов (460 гигов) переименовались в течении 1 минуты.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.