PDA

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


lev0tsk
01-06-2020, 12:47
Добрый день!

Такая проблема - периодически поступают файлы следующего формата БББЦЦЦЦЦ.dat, их надо переименовывать с увеличением значения "ЦЦЦЦЦ" на определенную величину
Вот такой CMD:

set "ni=06300"

FOR %%a IN ("TST*.dat") DO call :nn_fnd "%%a"

Exit

:nn_fnd
set "fname=%~n1"
set "fnd=%fname:~-8,3%"& set "n1=%fname:~-5%"
set /a "nn=1%n1% + 1%ni%"
set "nn=%nn:~1%"
ren "%~1" "%fnd%%nn%%~x1"
exit /b


Пример списка файлов:

tst00171.dat
tst00172.dat
tst00173.dat
tst00774.dat
tst01575.dat
tst01876.dat
tst05577.dat
tst09478.dat

Всё вроде бы работает, но первый файл переименовывается дважды - первым в цикле (как и должно быть), и перед "tst09478".
После первого раза - tst06471.dat, и потом ещё раз - tst12771.dat
в итоге вся суть идеи теряет смысл...(((

Не пойму, в чем косяк...

Foreigner
01-06-2020, 13:53
Попробуй так

@echo off
setlocal

set "ni=10"

for %%i in (tst*.dat) do call:ren %%i
goto:eof

:ren
set "fname=%~n1"
set /a val=%fname:tst=1%+%ni%
ren %1 tst%val:~1,9%%~x1

lev0tsk
01-06-2020, 15:40
Попробуй так »

Аналогично работает - первый файл два раза обрабатывает...((

Проблема решилась - подсмотрел в "Похожих темах" внизу страницы )))

CMD/BAT - [решено] Ошибка в переименовании группы файлов. (http://forum.oszone.net/thread-298883.html)

Foreigner
01-06-2020, 16:12
первый файл два раза обрабатывает »

Тогда не знаю. У меня все отрабатывает корректно.
Из tst00001.dat получаю tst00011, из tst00101.dat -- tst00111.dat, из tst00201.dat -- tst00211.dat и т.д.

Попробуйте перезапустить cmd.exe если ее не закрывали. В вашем батнике нет ограничения области видимости переменных и они после выполнения экспортируются в сессию консоли. Посмотрите переменные командой set

Попробуйте изменить for на

for /f %%i in ('dir /b tst*.dat') do ...

lev0tsk
01-06-2020, 16:43
Тогда не знаю. У меня все отрабатывает корректно. »
Погонял Ваш вариант CMD-шника, интересная штука выявилась...
до ni=99 - работает (вроде) корректно
при ni=100 - получается наложение: tst00001 + 100 = tst00101 (второй файл)
а при ni>100 - получается сабж, двойное переименование первого файла. Почему так - кукуй его знает...???

***
Попробуйте изменить for на »
В итоге я так и сделал (с использованием "dir") - то, что подсмотрел по ссылке в третьем моем сообщении!..)

Foreigner
01-06-2020, 16:56
Почему так - кукуй его знает...??? »
Так получается скорее всего, что начинаем переименовывать с первого файла, т.е. сортировка по порядку, из-за этого при переименовании возможно наткнуться на файл с таким же именем, попробуйте переименовывать с последнего:

for /f %%i in ('dir /b /o-n tst*.dat') do..

lev0tsk
01-06-2020, 17:10
Не-е... в том то и дело, что у меня по условию переименования "ni" всегда должно быть больше чем цифровая часть любого из файлов из списка.

А с "dir" нормально работает с любым порядком сортировки, т.к. список файлов создается до начала переименования и более не изменяется.

megaloman
01-06-2020, 20:56
@Echo Off
Set "FileIn=Z:\Box_In\tst?????.dat"
Set /A Plus=6300

For %%f In ("%FileIn%") Do Ren "%%f" "%%~nxf.~~~"
For %%f In ("%FileIn%.~~~") Do (
Set "Name=%%~nf"
Call :MyRen "%%f" "%%~nf" "%%Name:~0,3%%" "1%%Name:~3,5%%" %Plus%
)
Exit /B

:MyRen
Set /A N=%~4+%~5
Ren %1 "%~3%N:~1%%~x2"
Exit /B 0

megaloman
01-06-2020, 21:58
Если:что у меня по условию переименования "ni" всегда должно быть больше чем цифровая часть любого из файлов из списка »то можно так:@Echo Off
Set "FileIn=Z:\Box_In\tst?????.dat"
Set "Plus=06300"

For %%f In ("%FileIn%") Do (
Set "Name=%%~nf"
Call :MyRen "%%f" "%%Name:~0,3%%" "%%Name:~3,5%%" "%Plus%"
)
Exit /B

:MyRen
If 10%~3 GEQ 10%~4 Exit /B 1
Set /A N=10%~3+10%~4
Ren %1 "%~2%N:~2%%~x1"
Exit /B 0
В этом варианте при повторном запуске батника повторной добавки не будет.

DJ Mogarych
02-06-2020, 11:39
Powershell:

$num = 10

dir "c:\temp\tst*.dat" |% {
Rename-Item $_ -NewName ('tst' + ((($_.basename).substring(3,5) -as [int]) + $num).ToString("00000") + '.dat')
}

Busla
02-06-2020, 12:48
не нужно менять то множество, по которому итерируете

складывайте переименованное в другую директорию

lev0tsk
02-06-2020, 14:16
Спасибо всем откликнувшимся, вопрос решен... даже несколькими способами! )))
Как говорится - выбирай на вкус...

Iska
02-06-2020, 19:55
не нужно менять то множество, по которому итерируете »
Менять-то можно, только надо сначала его получить, а потом уже менять полученный набор. Иначе да, интересные фефекты фикции эффекты обеспечены.




© OSzone.net 2001-2012