2013-08-28 2 views
1

У меня есть большая коллекция телевизионных сериалов, сидящих на ящике NAS, которая делится средствами массовой информации через самбу и dlna по всему дому. Чтобы включить случайную функцию, я создал пакетный сценарий следующим образом, чтобы сделать файл список воспроизведения:Вывод команды DIR не так, как ожидалось, в пакетном файле

@Echo Off 
    color 0e 
    Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING ALL BAT, TXT, M3U, SRT and JPG FILES 
    del "playlist.m3u" 
    Setlocal EnableDelayedExpansion 
    set _tmp=%1 
    Set _t0=1 
    If ["%CD%"]==["%CD:~0,3%"] Set _t0=0 
    For /F "tokens=*" %%A In ('Dir "%*" /a-d /b /on /s ^|find /v ".bat"^| find /v ".m3u"^|find /v ".txt"^| find /v ".srt"^|find /v ".jpg"') Do (
    Set _t1=%%A 
    Set _t2=!_t1:%CD%=! 
    Echo !_t2:~%_t0%!)>>playlist.m3u 

Итак, у меня есть один из этих пакетных файлов в каждом каталоге (по одному на ТВ-шоу), а также родительскую папку (TV), и мои пользователи могут включить произвольный выбор в WMP, VLC или w/e-проигрывателе, который им нравится, и просто щелкнуть плей-лист, чтобы посмотреть случайное что-либо, или, более конкретно, случайный эпизод определенного шоу.

Итак, на мой вопрос: почему мой трубчатый выход не в алфавитном порядке? Я действительно хочу выполнить это в MS-DOS/CMD, поскольку программирование - это не мой опыт, и это в значительной степени ограничивает мои возможности сценариями или чем-либо еще. Я полагаю, что команда FIND может использоваться более элегантно, чтобы отфильтровать определенные типы файлов, и я подозреваю, что в этом мои проблемы возникают при попытке сортировки вывода. Даже плейлисты, предназначенные для шоу, по-видимому, имеют случайный порядок сортировки (файлы в сезонах являются алфавитными, но сезонный порядок кажется случайным). Мне также было интересно, может ли кто-нибудь пролить свет на получение папок с «&» во имя, не нарушающее вывода.

Любая помощь будет оценена по достоинству.

-T.J.

ответ

0

Хм ..

Первая точка - зачем вам алфавитный порядок, если ваше намерение состоит в том, чтобы сделать некоторые различные «случайный» выбор?

Далее - почему вы устанавливаете _tmp - вы не используете его.
Далее - скобки в вашем IF "%CD%"... являются избыточными - кавычки там, чтобы сказать партии, что строка может содержать разделители
Далее - переключатель /on говорит DIR для вывода выбранного каталога в алфавитном порядке.
Следующая - _t0, как представляется, предназначены для выбора «обкорнать 0» или «1» обкорнать символы, но DIR /s /b выход будет X:\dir...\filename - не семафор особо чувствительная ...
Следующая - Вы, кажется, опускали /i переключитесь с ваших FIND команд, чтобы сделать find нечувствительным к регистру.

Вы не указали свою структуру каталогов, поэтому «сезонный заказ» является туманным. Предположительно, у вас есть .. \ showame \ season \ episode. Подумайте, что произойдет, когда у вас есть сезон 1,2.,10,11. Если отсортировано, вы получите 1,10,11,2 .. Тот же комментарий может применяться к вашему названию эпизода.

Вот способ создания отсортированного списка. В этом случае он обнаружит файлы, содержащие with во всех подкаталогах из текущего, минус выбранные расширения в любом случае - потому что у меня есть разумное количество имен файлов, содержащих with и & (также ! и %) в моем каталоге пакетных тестов , Также обратите внимание, что новый файл создается без метода delete and append. также имя выходного файла отличается - и DELAYEDEXPANSION не вызывается.

@ECHO OFF 
SETLOCAL 
(
For /F "tokens=*" %%A In ('Dir "*with*" /a-d /b /s ^|find /i /v ".bat"^| find /i /v ".m3u"^|find /i /v ".txt"^| find /i /v ".srt"^|find /i /v ".jpg"^|sort') Do (
ECHO %%A 
) 
)>newfile.txt 
GOTO :EOF 

Вы не говорите, где & ломает код. Эта структура не заботится - & и другие сложные персонажи действуют довольно счастливо.Возможно, ваши трудности связаны с секцией кода, которую вы показали - возможно, они позже ...

И, наконец, DIR относительно прост и не позволяет исключать из-за имени. Возможно, более элегантным методом будет использование

xcopy /y /L /s sourcedir x:\nul\ 

вопрос для экспериментов. XCOPY /? из приглашения на документацию, которая покажет, как использовать переключатель /exclude:. Тем не менее, два предостережения - подход xcopy выберет имена каталогов, а последняя строка будет содержать список файлов.

if not exist "%%A\." if exist "%%A" ECHO %%A 

должен преодолеть эти две проблемы.

+0

1. Я люблю случайный, когда я нахожусь в постели и беспокойный, но мой партнер и я будем выпивать сезон в дождливое воскресенье, если мы действительно влюбимся в серию. Следующая структура каталогов, например: «Z: \ md0 \ Video \ TV \ Игра престолов \ Сезон 1 \ S01E01 - Зима .... avi» Оцените быстрый ответ, верните сообщение, как только сможете. -T.J. – tjs4ever

0

Посмотрите, делает ли это то, что вам нужно. Приведите пример плейлиста, если он нуждается в настройке.

@Echo Off 
color 0e 
Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING ALL BAT, TXT, M3U, SRT and JPG FILES 
del "playlist.m3u" 2>nul 
For /F "delims=" %%A In (' Dir "%*" /a-d /b /on /s ^|findstr /v /i ".bat .m3u .txt .srt .jpg" ^|sort ') Do (
Echo %%~pnxA 
>>playlist.m3u Echo %%~pnxA 
) 
+0

Не работает правильно. Пример вывода: «\ md0 \ Video \ TV \ 3rd его Rock from the Sun \ Season 1 \ 3rd Rock from the Sun - 1x01 - Brains and Eggs.avi», потому что он находится на сетевом диске и делится по всему дому, сопоставления часто различаются в зависимости от предпочтений пользователя. Пользователь, который отображает только папку с ТВ, не может использовать список воспроизведения. Моя партия производит «Season 1 \ 3rd Rock from the Sun - 1x01 - Brains and Eggs.avi», а медиаплееров, которых я использую, используется в текущем каталоге. Однако мой список не работает: Сезон 6, 3, 2, 5, 4, 1. – tjs4ever

0

Я знаю, что это было некоторое время, но вот окончательный пакетный скрипт, который генерирует нужный мне результат:

@Echo Off 
color 0e 
Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING BAT, TXT, M3U, SRT and JPG FILES 
del "playlist.m3u" 
Setlocal EnableDelayedExpansion 
Set _t0=1 
If ["%CD%"]==["%CD:~0,3%"] Set _t0=0 
For /F "tokens=*" %%A In ('Dir "%*" /a-d /b /on /s ^|findstr /v /i ".bat .m3u .txt .srt .jpg"^| sort') Do (
Set _t1=%%A 
Set _t2=!_t1:%CD%=! 
Echo !_t2:~%_t0%!)>>playlist.m3u 

Прости, что я так долго, чтобы вернуться сюда, но вы знаете, , жизнь иногда мешает. Ниже приведен пример моего желаемого результата. Список файлов таким образом работает как плейлисты .m3u, которые будут проигрывать сетевое местоположение, будет ли папка сопоставлена ​​с буквой диска или нет. Он также работает независимо от того, где в иерархии папок пользователь решает сопоставить. Пример:

Z:\md0\media\tv\30 rock\season 1\s01e01.avi 
or 
y:\tv\30 rock... 
or 
r:\30 rock... 
or even 
\\tjmediaserver\video\tv\30 rock\... 

Все допустимые способы доступа пользователей к моему открытому сетевому ресурсу в этом месте. Пример вывода партии:

Season 1\30 Rock S01E01 Pilot.avi 
Season 1\30 Rock S01E02 The Aftermath.avi 
Season 1\30 Rock S01E03 Blind Date.avi 

Оба Windows Media Player, и VLC (только игроки, которые мы используем) предположим, что файлы находятся в подкаталогах, где .m3u хранится. Удобно, если я хочу посмотреть шоу «X» с самого начала или включить перетасовку в моем медиаплеере и посмотреть случайные «x» или «x» и «y».