Компьютерный форум 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=184481)

ArsenBespalov 02-09-2010 14:44 1487168

Пакетное переименование файлов
 
Здравствуйте! Возможно такой вопрос уже задавался, но я не нашел, прошу прощения, если повторюсь.

У меня затык произошел, ситуация следующая:
  • Есть исходные файлы по формату 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 1487206

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

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

3. добавте в цикл еще одну переменню (так менее красиво, но чуточку быстрее):
set n=00!id!
set n=!n:~-3!

и в команде copy вместо %id% используйте !n!
* неизменяемые переменные можно оставить в процентах

gora 02-09-2010 16:00 1487243

Цитата:

Цитата NiOl
так менее красиво, но чуточку быстрее »

Про быстрее я не понял, а про красиво...
Код:

set id=1000
...
copy /y %prefix%_!id:~-3! to_dir\%%i
...

;)

ArsenBespalov 03-09-2010 05:26 1487581

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

gora 03-09-2010 09:16 1487645

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 1487786

gora, окознал свою ошибку, спасибо за совет! Вернее даже за решение!

Actav 14-04-2016 14:50 2626080

Тема хоть и старая но пришлась как нельзя к стати.
Только стоит дабавить расширения файлов в строку

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

Lenich 08-08-2016 23:52 2657971

Ребята, объясните человечьим языком значение вот этого:

Цитата:

!n:~-3!

Iska 09-08-2016 02:18 2657990

Человечьим языком объяснено здесь:
Код:

set /?
Извлечёт последние три символа переменной окружения «n».

Lenich 11-08-2016 03:56 2658677

Iska, спасибо человек!


Время: 01:33.

Время: 01:33.
© OSzone.net 2001-