|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как дописать случайные числа к началам имён файлов в каталоге |
|
|
CMD/BAT - [решено] Как дописать случайные числа к началам имён файлов в каталоге
|
Ушел из жизни Сообщения: 8595 |
Знаю что задача простенькая -- но давно не занимался такого класса задачками...
Приписать случайные (достаточно трёх-пяти разрядов) числа и разделитель к началу имён всех файлов каталога (подкаталоги не интересуют), т.е. вместо, например, ... ofigennaya_pesnya.mp3 prosto_obaldenno.mp3 ... получить типа: ... 32761_prosto_obaldenno.mp3 ... 56845_ofigennaya_pesnya.mp3 ... (желательно с одинаковым числом цифр, т.е., например, не 53, а 00053 при пятиразрядных, или 053 при трёхразрядных). Названия, приведённые для примера, подсмотрены на одном из чужих компов. ![]() |
|
------- Отправлено: 00:03, 28-08-2014 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Как-то так:
@echo off setlocal enableextensions enabledelayedexpansion set sSourceFolder=%~1 set sTemplate=00000 if defined sSourceFolder ( if exist "%sSourceFolder%\." ( for /f "usebackq delims=" %%i in ( `dir /b /a:-d "%sSourceFolder%\*.*" 2^>nul` ) do ( set sPredicate=%sTemplate%!random! ren "%sSourceFolder%\%%~i" "!sPredicate:~-5!_%%~i" ) ) else ( echo Can't find source folder [%sSourceFolder%]. exit /b 2 ) ) else ( echo Usage: %~nx0 ^<Source folder^> exit /b 1 ) endlocal exit /b 0 |
Отправлено: 01:20, 28-08-2014 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 01:32, 28-08-2014 | #3 |
Ушел из жизни Сообщения: 8595
|
Профиль | Сайт | Отправить PM | Цитировать Iska, отлично, спасибо!
Маленькая погрешность: не переименовались файлы, имена которых содержат восклицательный знак. Vadikan, собственно, конкретную задачу можно понять из примеров: [достаточно] случайным образом пересортировать порядок следования файлов с неслучайными именами. ![]() |
------- Отправлено: 01:38, 28-08-2014 | #4 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать Цитата mwz:
Без проверки на уникальность: |
||
------- Отправлено: 02:03, 28-08-2014 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата mwz:
Приведённый ранее код можно заменить, например, таким, используя двойное раскрытие переменных окружения по «call»: @echo off setlocal enableextensions disabledelayedexpansion set sSourceFolder=%~1 set sTemplate=00000 if defined sSourceFolder ( if exist "%sSourceFolder%\." ( for /f "usebackq delims=" %%i in ( `dir /b /a:-d "%sSourceFolder%\*.*" 2^>nul` ) do ( call set sPredicate=%sTemplate%%%random%% call ren "%sSourceFolder%\%%~i" "%%sPredicate:~-5%%_%%~i" ) ) else ( echo Can't find source folder [%sSourceFolder%]. exit /b 2 ) ) else ( echo Usage: %~nx0 ^<Source folder^> exit /b 1 ) endlocal exit /b 0 Цитата mwz:
Если для воспроизведения — так ведь практически все известные мне плееры имеют функцию «перемешивания» файлов в списке. Можно даже просто составить список .m3u из исходных файлов в произвольном порядке и «скормить» его плееру. |
||
Отправлено: 02:57, 28-08-2014 | #6 |
Ушел из жизни Сообщения: 8595
|
Профиль | Сайт | Отправить PM | Цитировать Vadikan, попробовал cmd-файл (Windows-7); увы:
"Rename-Item" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. (глубже пока не полез). Цитата Iska:
Да, задача чисто утилитарная: перемешивание музыкальных файлов, которые затем кидаются на флэшку формата FAT32 (плеер в автомобиле воспроизводит их в натуральном порядке, т.е. в порядке следования их в таблице FAT) и могут быть затем переименованы назад (почему и желательно было одинаковое число цифр: для автоматизации) с сохранением случайности порядка в таблице FAT. .m3u -- у плеера с ними какие-то проблемы (похоже что в случае, если файл, стоящий на очереди, удалён с флэшки: после этого идёт сообщение типа "Неверный формат" и флэшку приходится перезаливать, поскольку перестаёт играть её вообще). Опять же список надо всё равно сортировать, что и отметил Vadikan. Случайный порядок воспроизведение -- да, есть; но у алгоритма конкретного плеера оказались "свои музыкальные предпочтения": даже при количестве файлов порядка тысячи (5 знаков в исходном вопросе я взял с запасом, зная что на сложность решения это не должно повлиять) некоторые композиции он может прокрутить по пять раз в час, а некоторые -- раз в пару месяцев. Промежуточный выход был найден: предварительная сортировка по размеру и скидывание в этом порядке (файлы, подготовленные к записи на флэшку, лежат жёсткими ссылками в отдельном каталоге и потихоньку пополняются, файлы же, удалённые с флэшки, переносятся отсюда в другую папку чтобы не зацепить их снова; установленная утилита LinkShellExtention зрительно проявляет жёсткие ссылки в основном каталоге и сразу видно, что файл или уже лежит в папке с подготовленными, или что заведомо не должен там лежать). Но некоторые длинные одинаковые композиции в разных вариациях оказались достаточно близки друг к другу. А тут как раз надо перезалить флэшку -- и я рискнул задать вопрос, зная что каких-то трудностей он не должен вызвать (правда, думал что будет использован цикл for и переменная %random% -- то направление, которое я собирался попробовать, не сообразив что можно использовать dir с передачей результата на дальнейшую обработку, как в последнем скрипте у Vadikan; извинения за уточнение с восклицательными знаками: понятно что в данном случае это некритично, и пяток-десяток файлов можно и вручную потасовать). |
|
------- Последний раз редактировалось mwz, 28-08-2014 в 11:31. Отправлено: 11:19, 28-08-2014 | #7 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать mwz, это PowerShell, другую консоль надо открыть или так. Спасибо за развернутое описание задачи
![]() |
------- Отправлено: 12:58, 28-08-2014 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать mwz, спасибо, теперь ясно. Разве что — я бы не переименовывал оригинальные файлы, а копировал результирующие файлы под новым именем в отдельный каталог.
|
Отправлено: 15:28, 28-08-2014 | #9 |
Ушел из жизни Сообщения: 8595
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Iska:
![]() А так и места не занимают (хардлинки ж, а их и переименовать без влияния на двойников в основном каталоге можно как угодно, и если изменять, типа добавления или правки тэгов в основном каталоге (и наоборот: в каталоге подготовленном для заливки) -- сразу и в хардлинках это будет отражено; при условии, разумеется, что не происходит удаления исходного файла с записью откорректированного на его место -- но в этом случае сразу пропадает метка жёсткой связи), и видно что где. Цитата Vadikan:
PS Vadikan, Да, скрипт PowerShell я выполнил, запустив его окно и вставив команду (с учётом имени каталога). ![]() Результат тоже хороший -- и тоже споткнулось на некоторых символах (на квадратной скобке, насколько понимаю); разделителем же стал не знак подчёркивания, а дефис, хотя в команде вижу именно знак подчёркивания. Ошибки обработки -- такие: |
||
------- Последний раз редактировалось mwz, 29-08-2014 в 00:13. Отправлено: 23:14, 28-08-2014 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Вывод имён файлов файлов "по маске" | SANIOK_AV | Скриптовые языки администрирования Windows | 2 | 17-07-2012 19:10 | |
Разное - [решено] Как получить список файлов находящихся в каталоге? | Kocuk | Microsoft Windows 2000/XP | 8 | 27-02-2012 23:25 | |
Delphi - [решено] Случайные числа | Ruzik | Программирование и базы данных | 5 | 13-11-2008 08:22 | |
Ошибка - Искажение имён файлов | vagifali | Microsoft Windows 2000/XP | 0 | 28-06-2008 15:38 | |
Случайные числа на JavaScript | Dimonweb | Вебмастеру | 2 | 12-08-2004 03:23 |
|