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

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

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

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


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

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


Код, представленный ниже, отлично справляется со своей задачей перемешивания строк в файле. Проблема в том, что у него в условиях жестко задаются пути к файлам 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

Отправлено: 15:39, 26-02-2016

 

Аватара для Elven

Ветеран


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

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


Например так.
Код: Выделить весь код
@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
Скрипт, однако, не учитывает, что есть папки в которых нет указанных файлов, но это уже если нужно будет... Еще прошу учесть что ничего не проверялось, вообще писал по памяти, чет в конец рабочего дня в пятницу вообще все лень.

Отправлено: 15:57, 26-02-2016 | #2



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

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


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


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

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


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

Код: Выделить весь код
set "in=E:\MIX\MPL\%%~fi\%%~ni.alb"
set "out=E:\MIX\MPL\%%~fi\%%~ni.alb"
Выдает
Цитата:
Не удается найти файл
Переменная среды $ не определена
Системе не удается найти указанный путь
Цитата Elven:
Скрипт, однако, не учитывает, что есть папки в которых нет указанных файлов »
Таких папок и не будет, так как они создаются перед этим тоже скриптом

Код: Выделить весь код
@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
Может как раз легче в этот код добавить функцию перемешивания? Что б уже создавались они рандомизированные?

Последний раз редактировалось krokradio, 26-02-2016 в 16:16. Причина: Уточнение вопроса


Отправлено: 16:09, 26-02-2016 | #3


Аватара для Elven

Ветеран


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

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


Исправил.

Отправлено: 16:36, 26-02-2016 | #4


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


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

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


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

Отправлено: 16:47, 26-02-2016 | #5


Ветеран


Contributor


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

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


Цитата krokradio:
Код, представленный ниже, отлично справляется со своей задачей ...
Не берусь в него вникнуть, поэтому предлагаю:
Шаг 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

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


Последний раз редактировалось megaloman, 27-02-2016 в 05:44.


Отправлено: 05:37, 27-02-2016 | #6


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


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

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


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



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

Отправлено: 14:02, 27-02-2016 | #7


Ветеран


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

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


krokradio, А что вообще вы хотите получить в итоге?
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:33, 27-02-2016 | #8


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


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

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


Цитата krokradio:
Мне нужна обработка всех файлов "*.alb" во всех подпапках папки "MPL". »
У меня есть 20 папок:
E:\MIX\MPL\name01\name01.alb
E:\MIX\MPL\name01\name02.alb
E:\MIX\MPL\name01\name03.alb
и т.д.

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

Отправлено: 16:01, 27-02-2016 | #9


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


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

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


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

Код: Выделить весь код
@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
Он обрабатывает все плейлисты по очереди, но оставляет их пустыми. Переменная $$ не определена.


Отправлено: 16:18, 27-02-2016 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Запуск пакетного файла от имени администратора SANIOK_AV Microsoft Windows 7 0 15-01-2014 13:07
CMD/BAT - Переменная в батнике, зависимая от имени файла russur Скриптовые языки администрирования Windows 14 25-05-2012 20:45
CMD/BAT - [решено] Запуск bat-файла от имени админа.Как сделать каталог этого bat-файла текущим?? axmed0207 Скриптовые языки администрирования Windows 1 19-01-2012 06:14
Delphi - Корректировка текстовго файла Hardip Программирование и базы данных 1 29-11-2010 20:46
Разное - Как сделать и можно ли что бы не от имени администратора заводить программы dima1981 Microsoft Windows 7 2 07-05-2009 21:28




 
Переход