Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Непонятная ошибка при переименовании файлов в цикле

Ответить
Настройки темы
CMD/BAT - [решено] Непонятная ошибка при переименовании файлов в цикле

Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день!

Такая проблема - периодически поступают файлы следующего формата БББЦЦЦЦЦ.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
в итоге вся суть идеи теряет смысл...(((

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

Отправлено: 12:47, 01-06-2020

 

Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Попробуй так
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:53, 01-06-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Попробуй так »
Аналогично работает - первый файл два раза обрабатывает...((

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

CMD/BAT - [решено] Ошибка в переименовании группы файлов.

Отправлено: 15:40, 01-06-2020 | #3


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


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

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

Попробуйте изменить for на
Код: Выделить весь код
for /f %%i in ('dir /b tst*.dat') do ...

Отправлено: 16:12, 01-06-2020 | #4


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 16:43, 01-06-2020 | #5


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата lev0tsk:
Почему так - кукуй его знает...??? »
Так получается скорее всего, что начинаем переименовывать с первого файла, т.е. сортировка по порядку, из-за этого при переименовании возможно наткнуться на файл с таким же именем, попробуйте переименовывать с последнего:
Код: Выделить весь код
for /f %%i in ('dir /b /o-n tst*.dat') do..

Отправлено: 16:56, 01-06-2020 | #6


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 17:10, 01-06-2020 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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:01.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:56, 01-06-2020 | #8


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Если:
Цитата lev0tsk:
что у меня по условию переименования "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
В этом варианте при повторном запуске батника повторной добавки не будет.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:58, 01-06-2020 | #9


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Powershell:
Код: Выделить весь код
$num = 10

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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:39, 02-06-2020 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Непонятная ошибка при переименовании файлов в цикле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - При переименовании файлов "Этот файл или папка не доступны" DmitriySC Microsoft Windows 10 1 05-07-2016 16:41
CMD/BAT - [решено] Ошибка в переименовании группы файлов. shao Скриптовые языки администрирования Windows 8 24-04-2015 14:17
Разное - Ошибка при переименовании папки, файла vit063 Microsoft Windows Vista 6 22-07-2010 10:33
Разное - Ошибка 0x80004005 при создании или переименовании папок sektor1876 Microsoft Windows 7 19 01-06-2010 16:01
Разное - При переименовании файлов они меняют своё имя только после нажатия F5. roniro Microsoft Windows 2000/XP 1 11-02-2010 16:04




 
Переход