Войти

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


krokradio
26-02-2016, 15:39
Код, представленный ниже, отлично справляется со своей задачей перемешивания строк в файле. Проблема в том, что у него в условиях жестко задаются пути к файлам 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
26-02-2016, 15:57
Например так.
@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

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

krokradio
26-02-2016, 16:09
Что-то не так. Пробовал и чистый Ваш вариант и меняя

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

Выдает
Не удается найти файл
Переменная среды $ не определена
Системе не удается найти указанный путь

Скрипт, однако, не учитывает, что есть папки в которых нет указанных файлов »
Таких папок и не будет, так как они создаются перед этим тоже скриптом

@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
26-02-2016, 16:36
Исправил.

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

megaloman
27-02-2016, 05:37
Код, представленный ниже, отлично справляется со своей задачей ...
Не берусь в него вникнуть, поэтому предлагаю:
Шаг 1.
Попробуйте скрипт
@Echo Off
cls

Set "Where=E:\MIX\MPL"

SetLocal EnableExtensions EnableDelayedExpansion

FOR /F "usebackq delims=" %%d IN (`Dir "%Where%" /b /A:D 2^>nul`) DO (
If Exist "%Where%\%%d\%%d.alb" Call :Working "%Where%\%%d\%%d.alb"
)
GoTo :Eof

:Working

set "in=%~1"
set "out=%~1"

Echo %in%
Echo %out%

Если имена файлов отображаются нормально, то:

Шаг 2.
Вместо двух последних строк c Echo добавьте текст своего скрипта начиная с Вашего первого for

krokradio
27-02-2016, 14:02
Попробуйте скрипт »

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

http://s8.hostingkartinok.com/uploads/thumbs/2016/02/0630d6be8181deaed89d07f365b15e32.png (http://hostingkartinok.com/show-image.php?id=0630d6be8181deaed89d07f365b15e32)

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

Foreigner
27-02-2016, 15:33
krokradio, А что вообще вы хотите получить в итоге?

krokradio
27-02-2016, 16:01
Мне нужна обработка всех файлов "*.alb" во всех подпапках папки "MPL". »

У меня есть 20 папок:
E:\MIX\MPL\name01\name01.alb
E:\MIX\MPL\name01\name02.alb
E:\MIX\MPL\name01\name03.alb
и т.д.

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

krokradio
27-02-2016, 16:18
Я пробовал еще такой вариант

@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

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

http://s8.hostingkartinok.com/uploads/thumbs/2016/02/3d32824df54daf425f81baa1629a0843.png (http://hostingkartinok.com/show-image.php?id=3d32824df54daf425f81baa1629a0843)

Iska
27-02-2016, 16:39
krokradio, А что вообще вы хотите получить в итоге? »
Вооот. С этого надо было начинать :).

Foreigner
27-02-2016, 17:07
krokradio, Я правильно понял, что нужно найти все *.alb и перемешать их содержимое?

@echo off
setlocal

for /f "tokens=*" %%i in ('dir /b /s E:\MIX\MPL\*.alb') do (

for /f "tokens=*" %%j in ('type "%%i"') do call:set_random "%%j"
call:set_content "%%i"

)

goto:eof

:set_random
set "line_%random%=%~1"
goto:eof

:set_content

1>%1 (

for /f "tokens=2* delims==" %%i in ('set line_') do echo %%i

)

for /f "tokens=1 delims==" %%i in ('set line_') do set "%%i="



PS. Проверил на тестовых *.txt

krokradio
27-02-2016, 18:13
Foreigner, господи, мил человек, слава тебе! Ты все правильно понял! И оно работает так как нужно! Огромное тебе спасибо!




© OSzone.net 2001-2012