Вывод команды DIR отличается от ожидаемого в пакетном файле

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

    @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

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

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

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

-T.J.


person tjs4ever    schedule 28.08.2013    source источник


Ответы (3)


Хм..

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

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

Вы не показали свою структуру каталогов, поэтому «порядок сезона» туманен. Предположительно, у вас есть ..\showname\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

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

person Magoo    schedule 28.08.2013
comment
1. Мне нравится рандом, когда я в постели и беспокойный, но мы с моим партнером выпьем за сезон в дождливое воскресенье, если мы действительно влюбимся в сериал. Следующая структура каталогов, пример: Z:\md0\Video\TV\Game of Thrones\Season 1\S01E01 - Winter....avi Спасибо за быстрый ответ, выложу, как только смогу. -Т.Дж. - person tjs4ever; 02.09.2013

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

@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
)
person foxidrive    schedule 29.08.2013
comment
Не работал правильно. Пример вывода: \md0\Video\TV\3rd his Rock from The Sun\Season 1\3rd Rock from the Sun - 1x01 - Brains and Eggs.avi, потому что он находится на сетевом диске и используется во всем моем доме, сопоставления часто различаются в зависимости от предпочтений пользователя. Пользователь, который сопоставляет только папку TV, не может использовать список воспроизведения. Моя партия производит сезон 1\3rd Rock from the Sun - 1x01 - Brains and Eggs.avi, и медиаплееры, которые я использую, предполагают текущий каталог. Однако мой список не по порядку: сезон 6, 3, 2, 5, 4, 1. - person tjs4ever; 02.09.2013

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

@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».

person tjs4ever    schedule 21.01.2014