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

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

dokxpi@vk 07-05-2015 12:43 2504722

Переименование файлов в каталоге (.avi)
 
Доброго времени суток

Нужно все файлы с расширением .avi
привести/переименовать
в следующий вид:
2008-03-07_13.avi
2010-06-28_01.avi
и т. д.
Где 2008-03-07 - <год>.<дата>.<месяц>
создания файлов (когда было снято)
_01 - нумерация файлов в текущий папке

По возможности: добавить рекурсию, но
чтобы в каждом вложенном каталоге,
нумерация файлов начиналась с _01 а не
продолжался общий счет

Заранее благодарен

megaloman 07-05-2015 18:27 2504822

Код:

@Echo Off

Set "Where=D:\Media"
Set "Mask=*.avi"

Set /A Count=1000
FOR /F "usebackq delims=" %%f IN (`Dir "%Where%\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%Where%\%%f" "%Where%"

FOR /F "usebackq delims=" %%d IN (`Dir "%Where%\" /b /s /A:D  2^>nul`) DO (
        Set /A Count=1000
        FOR /F "usebackq delims=" %%f IN (`Dir "%%d\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%%d\%%f" "%%d"
)
GoTo :Eof

:Recount
Set /A Count=%Count%+1

Set "DC=%~t1"
Set "DC=%DC:~6,4%-%DC:~3,2%-%DC:~0,2%"

ren %1 "%DC%_%Count:~-2%%~x1"

У Вас мутноватая постановка: 2010-06-28 никак не может быть <год>.<дата>.<месяц>, не понятно, что такое нумерация файла в папке: по какому принципу они отсортированы?
Вы уверены, что в папке не более 99 файлов?
В приведенном батнике файлы отсортированы по дате последнего изменения, соответственно ведётся и нумерация.

dokxpi@vk 07-05-2015 18:42 2504827

megaloman, что-то не так, даже не запускается

dokxpi@vk 07-05-2015 19:00 2504832

Цитата:

<год>.<дата>.<месяц>
Сорри.. <год>.<месяц>.<дата>
Цитата:

Цитата megaloman
Вы уверены, что в папке не более 99 файлов? »

Меньше
Цитата:

Цитата megaloman
не понятно, что такое нумерация файла в папке »

Я просто хотел сказать, что если папка новая, то считать нужно начинать с 1

Цитата:

Цитата megaloman
будьте любезны озаботиться чтобы батник был в 866 кодировке (ДОС)/ Проверьте, маска файла правильная? Set "Mask=*.avi" »

С этим всё в порядке, изначально маску изменил на .avi и сохранил в 866 кодировке...

dokxpi@vk 07-05-2015 19:16 2504838

Нечего не происходит, с файлами точно
https://yadi.sk/d/cRkOqGkBgVMDJ (окно запуска)

Код:

@Echo Off

Set "Where=D:\Media"
Set "Mask=*.avi"

rem FOR /F "usebackq delims=" %%d IN (`Dir "%Where%\" /b /s /A:D`) DO (

FOR /F "usebackq delims=" %%d IN (`Dir /b /s /A:D`) DO (

echo %%d

        Set /A Count=1000
        FOR /F "usebackq delims=" %%f IN (`Dir "%%d\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%%d\%%f" "%%d"
)
GoTo :Eof

:Recount
Set /A Count=%Count%+1

Set "DC=%~t1"
Set "DC=%DC:~6,4%-%DC:~3,2%-%DC:~0,2%"

rem ren %1 "%DC%_%Count:~-2%%~x1"


echo ren %1 "%DC%_%Count:~-2%%~x1"


megaloman 07-05-2015 19:37 2504844

Код:

@Echo Off
cls

Set "Where=D:\Media"
Set "Mask=*.avi"

Echo ========= Begin bat =============
pause

Set /A Count=1000
FOR /F "usebackq delims=" %%f IN (`Dir "%Where%\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%Where%\%%f" "%Where%"

pause

FOR /F "usebackq delims=" %%d IN (`Dir "%Where%\" /b /s /A:D  2^>nul`) DO (
        Set /A Count=1000
        FOR /F "usebackq delims=" %%f IN (`Dir "%%d\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%%d\%%f" "%%d"
pause
)
GoTo :Eof

:Recount
Set /A Count=%Count%+1

Set "DC=%~t1"
Set "DC=%DC:~6,4%-%DC:~3,2%-%DC:~0,2%"

echo ren %1 "%DC%_%Count:~-2%%~x1"

Попробуйте этот вариант. Что батник выдаёт на экран? Или ничего не выдаёт?
Исправил неточность в первоначальном коде вверху. Код рабочий. Что вверху, что вот этот отладочный (но отладочный реально не переименовывает, так как стоит эхо
echo ren %1 "%DC%_%Count:~-2%%~x1"

??????????????? :cool:

dokxpi@vk 08-05-2015 01:35 2504958

Цитата:

Цитата megaloman
echo ren %1 "%DC%_%Count:~-2%%~x1" »

https://yadi.sk/i/Ltf8y4zugViaZ
Цитата:

Исправил неточность в первоначальном коде вверху. Код рабочий.
Забрал
Спасибо, вам большое!

dokxpi@vk 08-05-2015 02:06 2504962

Всё гуд,
единственное — обходит папки, в которых, внутри имени присутствует нестандартные символы,
пример такой папки: "media ♫"

dokxpi@vk 08-05-2015 03:14 2504969

Цитата:

Цитата Georgio
Пакетный файл положить в корневую папку и запустить. »

Никаких эмоций, не работает

megaloman, вот только сейчас заметил: файлы переименовывает по дате изменения, а нужно по дате съёмки
https://yadi.sk/i/HkyGmPIDgVneK

Iska 08-05-2015 03:20 2504970

Цитата:

Цитата dokxpi@vk
megaloman, вот только сейчас заметил: файлы переименовывает по дате изменения, а нужно по дате съёмки »

Старайтесь изначально:
Цитата:

Цитата dokxpi@vk
Где 2008-03-07 - <год>.<дата>.<месяц>
создания файлов (когда было снято) »

точно формулировать задачу.

Вкупе с:
Цитата:

Цитата dokxpi@vk
обходит папки, в которых, внутри имени присутствует нестандартные символы,
пример такой папки: "media ♫" »

полагаю, что лучше будет пользовать PowerShell.

Georgio 08-05-2015 03:34 2504972

Код PowerShell:
Код:

gci '*.avi' -Recurse|%{rni $_ ((Get-Date ($x=(New-Object -ComObject Shell.Application).NameSpace(($y=$_.DirectoryName))).GetDetailsOf($x.ParseName($_.Name),12) -Format 'yyyy-MM-dd')+'_'+$(if($y -ne $z){$i=1};($i++).ToString().PadLeft(2,'0');$z=$y)+'.avi')}
.

Iska 08-05-2015 06:32 2504991

Цитата:

Цитата Georgio
.GetDetailsOf($x.ParseName($_.Name),12) »

Там не зависит от версии ОС?

Georgio 08-05-2015 13:18 2505114

Цитата:

Цитата Iska
Там не зависит от версии ОС? »


Понятия не имею. Я бы действительно рекомендовал устанавливать это число экспериментально, например, для русифицированных версий ОС код PowerShell для этого действия должен выглядеть примерно так:
Код:

1..40|%{if((New-Object -ComObject Shell.Application).NameSpace((gi Env:SystemDrive).Value).GetDetailsOf('',$_) -eq 'Дата съемки'){$_;break}}
(мой вариант).

Кстати, если даже установить это число наверняка, то далеко не факт, что этот пункт будет иметь непустое значение, поэтому в таком случае надо использовать дату создания, а для этого нужно "разветвлять" код.

У меня большое предчувствие, что ТС считает возможным переименовывать файлы по дате съёмки с помощью "чистого" пакетного файла. Если бы речь шла просто о дате создания, то можно было бы попробовать написать код пакетного файла (нечто подобное я уже где-то писал), но не знаю, стоит ли игра свеч.

dokxpi@vk 08-05-2015 19:43 2505259

Цитата:

Цитата Iska
точно формулировать задачу. »

Iska, а вы что-то другое процитировали? я же первоначально уточнил
Цитата:

создания файлов (когда было снято)
---------------------------
Цитата:

обходит папки, в которых, внутри имени присутствует нестандартные символы,
пример такой папки: "media ♫"
Чёрт с ним ...!
Главное поправить
Цитата:

Цитата Iska
megaloman, вот только сейчас заметил: файлы переименовывает по дате изменения, а нужно по дате съёмки »

---------------------------
Цитата:

Цитата Georgio
У меня большое предчувствие, что ТС считает возможным переименовывать файлы по дате съёмки с помощью "чистого" пакетного файла. »

Есть такое, так я и полагал

Iska 09-05-2015 00:14 2505334

Цитата:

Цитата dokxpi@vk
я же первоначально уточнил »

Цитата:

создания файлов (когда было снято)
Это Вы только сейчас жирным шрифтом уточнили. А слова «создания файлов» трактуются достаточно однозначно.

Цитата:

Цитата dokxpi@vk
Есть такое, так я и полагал »

Это никак не выйдет. Разве что какими-нибудь сторонними утилитами типа ReNamer. Там есть и мета-тэги: ReNamer:Meta Tags - den4b Wiki (но даты съёмки/записи avi там нет), и возрастающая нумерация: ReNamer:Rules:Serialize - den4b Wiki. Кстати сказать, и в свойствах файла Проводника Windows эта информация из *.avi у меня также не отображается (под Windows 7 в данный момент).

dokxpi@vk 21-05-2015 00:44 2509630

Цитата:

Это никак не выйдет. Разве что какими-нибудь сторонними утилитами типа ReNamer.
Нашёл
Total Commander ->Групповое переименование -> shelldetails ( wdx) ->
Код:

[=shelldetails.Дата создания мультимедиа.D-M-Y]#0[C]


Время: 09:46.

Время: 09:46.
© OSzone.net 2001-