Войти

Показать полную графическую версию : [решено] Пакетное переименование файлов


ArsenBespalov
02-09-2010, 14:44
Здравствуйте! Возможно такой вопрос уже задавался, но я не нашел, прошу прощения, если повторюсь.

У меня затык произошел, ситуация следующая:

Есть исходные файлы по формату Filename_XXX, где XXX - это порядковый номер.
Есть текстовый файл в котором списком написаны конечные имена фалов, т.е. файл Filename_023 соответствует HelloMyWorld, а, допустим, Filename_010 соответвует ThisIsMyName.
Требуется переименовать (вернее копировать) файлы Filename_XXX в уникальное имя, которое указано в текстовом файле, т.е. допустим Filename_001 берет свое имя из того самого файла в первой строке, а Filename_383 будет соответствовать 383 строка текстового файла.


Вот собственно для того чтобы переименовывать, вернее копировать я использую:

...
set prefix=Filename
set id=1
set DB=%1
...
for /f "eol=;" %%i to (%DB%) do (
copy /y %prefix%_%id% to_dir\%%i
set /a id=id+1
)

где %id% - это порядковый номер, %prefix% - собственно префиск исходных файлов, а %DB% - тот самый файлик, в котором прописаны уникальные имена файлов.

Проблемы на лицо, во-первых у меня не выполняется операция сложения в строке set /a id=id+1, во-вторых я не понимаю как вообще сделать занчение трехзначным, т.е. не Filename_1, а Filename_001, в-третьих я вообще отказался в итоге от данной реализации и начил отталкиваться от того, чтобы временно создавать текстовый файл со списком нужных нам исходных файлов:

dir /b "%prefix%*" > tmp.txt

Но я просто дальше не понимаю, что с этим делать. Ну, получил я список нужных мне файлов, а как этим списком воспользоваться в цикле FOR?

NiOl
02-09-2010, 15:28
1. Изменять переменные в цикле нужно используя "!" а не "%" - иначе у Вас значение так и не поменяется (внутри цикла). При этом в начале скрипта должна быть объявлена строка SetLocal EnableDelayedExpansion

2. очепятка в цикле - вместо "to" надо "in"

3. добавте в цикл еще одну переменню (так менее красиво, но чуточку быстрее):
set n=00!id!
set n=!n:~-3!
и в команде copy вместо %id% используйте !n!
* неизменяемые переменные можно оставить в процентах

gora
02-09-2010, 16:00
так менее красиво, но чуточку быстрее »
Про быстрее я не понял, а про красиво...
set id=1000
...
copy /y %prefix%_!id:~-3! to_dir\%%i
...
;)

ArsenBespalov
03-09-2010, 05:26
NiOl, gora, очень хорошо получилось с 001, но вот в процессе работы цикла на 1 все это дело не увеличивается, т.е. при копировании получилось то, что один Filename_001 размножился на все файлы.

gora
03-09-2010, 09:16
ArsenBespalov, да вроде все работает :dont-know
SetLocal EnableDelayedExpansion
set prefix=Filename
set id=1000
set DB=nameslist.txt

for /f "eol=;" %%i in (%DB%) do (
copy /y in_dir\%prefix%_!id:~-3! to_dir\%%i
set /a id=id+1
)
файл nameslist.txt HelloMyWorld
ThisIsMyName
Hel
MyWorld
World
Hello
This
HelloMy
My
HelloWorld
1HelloMyWorld
2HelloMyWorld
3HelloMyWorld
4HelloMyWorld
5HelloMyWorld
1ThisIsMyName
2ThisIsMyName
3ThisIsMyName
4ThisIsMyName
5ThisIsMyName
6ThisIsMyName
содержимое исходной папки Содержимое папки C:\Temp\in_dir

03.09.2010 08:37 <DIR> .
03.09.2010 08:37 <DIR> ..
03.09.2010 08:19 189 Filename_000
03.09.2010 08:19 189 Filename_001
01.09.2010 12:39 234 Filename_002
01.09.2010 10:36 1 514 Filename_003
01.09.2010 10:23 0 Filename_004
31.08.2010 10:44 1 490 Filename_005
31.08.2010 10:44 2 502 Filename_006
31.08.2010 10:44 2 543 Filename_007
31.08.2010 10:44 2 521 Filename_008
31.08.2010 10:44 2 250 Filename_009
31.08.2010 10:44 2 504 Filename_010
31.08.2010 10:44 2 504 Filename_011
31.08.2010 10:44 2 476 Filename_012
31.08.2010 10:44 2 361 Filename_013
31.08.2010 10:44 2 423 Filename_014
31.08.2010 10:44 357 Filename_015
31.08.2010 10:17 21 070 Filename_016
31.08.2010 08:34 47 935 Filename_017
31.08.2010 08:33 2 359 350 Filename_018
30.08.2010 11:10 7 020 Filename_019
30.08.2010 11:10 7 020 Filename_020
21 файлов 2 468 452 байт

содержимое папки приемника Содержимое папки C:\Temp\to_dir

03.09.2010 08:41 <DIR> .
03.09.2010 08:41 <DIR> ..
31.08.2010 10:44 2 504 1HelloMyWorld
31.08.2010 10:44 357 1ThisIsMyName
31.08.2010 10:44 2 504 2HelloMyWorld
31.08.2010 10:17 21 070 2ThisIsMyName
31.08.2010 10:44 2 476 3HelloMyWorld
31.08.2010 08:34 47 935 3ThisIsMyName
31.08.2010 10:44 2 361 4HelloMyWorld
31.08.2010 08:33 2 359 350 4ThisIsMyName
31.08.2010 10:44 2 423 5HelloMyWorld
30.08.2010 11:10 7 020 5ThisIsMyName
30.08.2010 11:10 7 020 6ThisIsMyName
01.09.2010 12:39 234 Hel
31.08.2010 10:44 1 490 Hello
31.08.2010 10:44 2 543 HelloMy
03.09.2010 08:19 189 HelloMyWorld
31.08.2010 10:44 2 250 HelloWorld
31.08.2010 10:44 2 521 My
01.09.2010 10:36 1 514 MyWorld
31.08.2010 10:44 2 502 This
03.09.2010 08:19 189 ThisIsMyName
01.09.2010 10:23 0 World
21 файлов 2 468 452 байт

ArsenBespalov
03-09-2010, 12:57
gora, окознал свою ошибку, спасибо за совет! Вернее даже за решение!

Actav
14-04-2016, 14:50
Тема хоть и старая но пришлась как нельзя к стати.
Только стоит дабавить расширения файлов в строку

copy /y in_dir\%prefix%_!id:~-3!.txt to_dir\%%i.txt

Lenich
08-08-2016, 23:52
Ребята, объясните человечьим языком значение вот этого:

!n:~-3!

Iska
09-08-2016, 02:18
Человечьим языком объяснено здесь:
set /?
Извлечёт последние три символа переменной окружения «n».

Lenich
11-08-2016, 03:56
Iska, спасибо человек!




© OSzone.net 2001-2012