CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Аватара пользователя
krokradio

CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Сообщение krokradio »

Код, представленный ниже, отлично справляется со своей задачей перемешивания строк в файле. Проблема в том, что у него в условиях жестко задаются пути к файлам in/out. В приведенном примере у меня задан путь "...\MPL\Chillout\Chillout.alb". И естественно обрабатывается только этот файл. У меня же в папке "MPL" лежит 20 подпапок с разными названиями и в каждой лежит файл "*.alb" с таким же именем, как и папка. Мне нужна обработка всех файлов "*.alb" во всех подпапках папки "MPL".





Код:

Код: Выделить всё

@echo off
set "in=E:\MIX\MPL\Chillout\Chillout.alb"
set "out=E:\MIX\MPL\Chillout\Chillout.alb"
setlocal enabledelayedexpansion
for /f "usebackq tokens=1,2*" %%i in ("%in%") do (
 set $%%j$!random!=%%i %%j %%k
 )
for /f "tokens=1,2 delims=$=" %%i in ('set $') do (
 if not "%%i"=="!x!" (
  set /a m+=1
  set x=%%i
 )
 set !m!$!random!=!$%%i$%%j!
 )
for /l %%i in (1 1 %m%) do (
 set $random=!random!
 for /f "delims==" %%j in ('set %%i$') do (
  set !$random!$$!random!=!%%j!
  )
 for /f "delims==" %%j in ('set !$random!$$') do (
  set /a n+=1
  set $$!n!$!random!=!%%j!
  )
 set n=
 ) 
>"%out%" (
for /f "tokens=2 delims==" %%i in ('set $$') do (
 echo %%i
 )
)
exit /b
Аватара пользователя
Elven

Re: CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Сообщение Elven »

Например так.



Код:

Код: Выделить всё

@echo off
setlocal enabledelayedexpansion
pushd E:\MIX\MPL\
for /f "delims=" %%y in ('dir /b /a:d') do (
set "in=%%~fy\%%~ny.alb"
set "out=%%~fy\%%~ny.alb"
for /f "usebackq tokens=1,2*" %%i in ("%in%") do (
 set $%%j$!random!=%%i %%j %%k
 )
for /f "tokens=1,2 delims=$=" %%i in ('set $') do (
 if not "%%i"=="!x!" (
  set /a m+=1
  set x=%%i
 )
 set !m!$!random!=!$%%i$%%j!
 )
for /l %%i in (1 1 %m%) do (
 set $random=!random!
 for /f "delims==" %%j in ('set %%i$') do (
  set !$random!$$!random!=!%%j!
  )
 for /f "delims==" %%j in ('set !$random!$$') do (
  set /a n+=1
  set $$!n!$!random!=!%%j!
  )
 set n=
 ) 
>"%out%" (
for /f "tokens=2 delims==" %%i in ('set $$') do (
 echo %%i
 )
)
)
popd

Скрипт, однако, не учитывает, что есть папки в которых нет указанных файлов, но это уже если нужно будет... Еще прошу учесть что ничего не проверялось, вообще писал по памяти, чет в конец рабочего дня в пятницу вообще все лень.
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Сообщение Iska »

Что-то не так. Пробовал и чистый Ваш вариант и меняя





Код:

Код: Выделить всё

set "in=E:\MIX\MPL\%%~fi\%%~ni.alb"
set "out=E:\MIX\MPL\%%~fi\%%~ni.alb"

Выдает


Цитата:



Не удается найти файл

Переменная среды $ не определена

Системе не удается найти указанный путь




Цитата Elven:



Скрипт, однако, не учитывает, что есть папки в которых нет указанных файлов
CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла




Таких папок и не будет, так как они создаются перед этим тоже скриптом





Код:

Код: Выделить всё

@echo off
setlocal enabledelayedexpansion
>nul chcp 1251
set "src=E:\MIX\MUSIC"
set "dest=E:\MIX\MPL"
set "files=*.mp3"
set "playlistext=.alb"
2>nul (md "%dest%"
for /f "delims=" %%i in ('dir/ad/b "%src%"') do >"%dest%\%%i%playlistext%" dir/a-d/b/s "%src%\%%i\%files%")
For %%a in (E:\MIX\MPL\*.alb) do md "E:\MIX\MPL\%%~na"& move "%%~a" "E:\MIX\MPL\%%~na"
exit /b

Может как раз легче в этот код добавить функцию перемешивания? Что б уже создавались они рандомизированные?
Аватара пользователя
Elven

Re: CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Сообщение Elven »

Та же ошибка. И пути похоже наблюдает. У меня сейчас 18 папок и выдает 18 ошибок. Возможно глупость, но не может это быть из-за кодировок?
Аватара пользователя
krokradio

Re: CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Сообщение krokradio »

Цитата megaloman:



Попробуйте скрипт
CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла




Попробовал. Имена отображаются нормально. А вот с обработкой загвоздка. Он где-то минуту работает с первой папкой. Прекрасно ее перемешивает. Потом думает 3-4 минуты и выдает следующе







Все остальные папки остаются не перемешанными.
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Сообщение Foreigner »

Цитата krokradio:



Мне нужна обработка всех файлов "*.alb" во всех подпапках папки "MPL".
CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла




У меня есть 20 папок:

E:\MIX\MPL\name01\name01.alb

E:\MIX\MPL\name01\name02.alb

E:\MIX\MPL\name01\name03.alb

и т.д.



Это плейлисты, созданные другим скриптом (третий пост темы). В них треки идут по порядку (как лежали в папках при создании плейлистов).

Мне нужно все эти плейлисты рандомизировать (перемешать) для дальнейшей их обработки.
Аватара пользователя
krokradio

Re: CMD/BAT - [решено] Корректировка кода что б не зависеть от жесткого пути к имени файла

Сообщение krokradio »

Я пробовал еще такой вариант





Код:

Код: Выделить всё

@echo off
for /f "delims=" %%a in ('dir /a-d /b /s "E:\MIX\MPL\*.alb"') do (
setlocal enabledelayedexpansion
for /f "usebackq tokens=1,2*" %%i in ("%%a") do (
 set $%%j$!random!=%%i %%j %%k
 )
for /f "tokens=1,2 delims=$=" %%i in ('set $') do (
 if not "%%i"=="!x!" (
  set /a m+=1
  set x=%%i
 )
 set !m!$!random!=!$%%i$%%j!
 )
for /l %%i in (1 1 %m%) do (
 set $random=!random!
 for /f "delims==" %%j in ('set %%i$') do (
  set !$random!$$!random!=!%%j!
  )
 for /f "delims==" %%j in ('set !$random!$$') do (
  set /a n+=1
  set $$!n!$!random!=!%%j!
  )
 set n=
 ) 
>"%%a" (
for /f "tokens=2 delims==" %%i in ('set $$') do (
 echo %%i
 )
)
)
exit /b

Он обрабатывает все плейлисты по очереди, но оставляет их пустыми. Переменная $$ не определена.



Ответить

Вернуться в «Скриптовые языки администрирования Windows»