Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сложное пакетное переимеонование (http://forum.oszone.net/showthread.php?t=241308)

Aleksander.Ruban@fb 25-08-2012 08:07 1976617

Сложное пакетное переимеонование
 
Прошу помочь!
Есть директория, в ней около ста папок с именами, в которых присутствуют либо "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 1976631

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 1976676

Цитата:

Цитата Foreigner
@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.
Но не понял, как заставить работать скрипт, если имя файла неизвестно.

В таком варианте:
Цитата:

Цитата Foreigner
@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 1976680

Цитата:

Цитата Aleksander.Ruban@fb
После запуска перименование не происходит.
Еще вопрос в первом варианте скобка ")" в конце нужна? »

Может тоже cso. Скобка нужна

Aleksander.Ruban@fb 25-08-2012 12:23 1976689

В таком варианте работает.
Цитата:

@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 1976710

Я не смог повторить, у меня все нормально. Сделайте листинг тестовой директории:
Код:

dir /b /s c:\2007\*.cso > file.txt
И выложите. Может какие-нибудь проблемы в названиях?

Aleksander.Ruban@fb 25-08-2012 13:27 1976727

Удалено. Дубль сваял.

Aleksander.Ruban@fb 25-08-2012 13:52 1976742

Листинг
До переименования
читать дальше »

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 1976754

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 1976922

Спасибо. Вы гений! Все сработало прекрасно: 1050 каталогов (460 гигов) переименовались в течении 1 минуты.


Время: 19:04.

Время: 19:04.
© OSzone.net 2001-