Воспроизвести случайный фильм / эпизод в папке из контекстного меню

286
Hashim

Цель

У меня относительно обширная коллекция мультимедиа, хранящаяся локально на моем компьютере в двух родительских папках («Фильмы» и «Шоу»). Моя цель - иметь возможность воспроизвести в произвольном порядке любой из фильмов или эпизодов, которые у меня есть в этих папках, щелкнув правой кнопкой мыши родительскую папку и выбрав пункт «Воспроизвести случайный фильм / эпизод» из расширенного контекстного меню.

Пакетный скрипт

У меня есть следующий пакетный скрипт, который хранится в папке на моем компьютере с Windows 7, которую я взял отсюда и адаптировал для поиска .mp4, .mkvи .aviфайлов (все расширения, из которых состоит моя медиа коллекция):

@echo off  setlocal  :: Create numbered list of files in a temporary file set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt" dir *.mp4,*.mkv,*.avi /b /s /a-d %1 | findstr /n "^" >"%tempFile%" & REM "  :: Count the files for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N call :openRandomFile  :: Delete the temp file del "%tempFile%" exit /b  :openRandomFile set /a "randomNum=(%random% %% cnt) + 1" for /f "tokens=1* delims=:" %%A in ( 'findstr "^%randomNum%:" "%tempFile%"' ) do start "" "%%B"  exit /b 

Элемент контекстного меню

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

[HKEY_CLASSES_ROOT\Directory\shell\Play random movie/episode] "Extended"="" "Position"="Top"  [HKEY_CLASSES_ROOT\Directory\shell\Play random movie/episode\command] @="\"B:\\Users\\Hashim\\Resources\\Windows Modding\\Play Random.bat\" \"%1\"" 

Где я застрял

Ключ реестра, кажется, работает достаточно хорошо - этот пункт отображается в расширенном контекстном меню для папок:

Воспроизвести случайный фильм / эпизод в папке из контекстного меню

... и при нажатии запускается командный файл. Проблемы заключаются в выполнении сценария.

  1. Вместо того, чтобы выбрать только те .mkv, .mp4и .aviформаты файлов, скрипт выбирает все типы файлов.

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

Эти проблемы сохраняются, несмотря на то, что сценарий использует dir *.mp4,*.mkv,*.avi /b /s /a-d %1для перечисления файлов, где %1находится параметр для целевой папки.

Почему скрипт не работает должным образом? Что я здесь пропустил?

3
Закомментируйте `@echo off` и посмотрите, что делает ваш пакетный файл. DavidPostill 6 лет назад 0
[Отладка ваших командных файлов] (http://www.robvanderwoude.com/battech_debugging.php) DavidPostill 6 лет назад 0
@DavidPostill - я потратил время на его отладку, именно так я и прошел от последней итерации вопроса к этой. Я действительно сделал это до того, как вы опубликовали свои комментарии к последнему вопросу, но мне нужно было немного поспать. Эта текущая итерация является результатом всей отладки, которую я смог выполнить, и теперь я оставляю это SU, чтобы помочь мне выяснить, что я не смог. Также, как и в вашем распоряжении, ваша ссылка на сайт Роба ван дер Вуде не работает, так как этот сайт не использует `https`. Hashim 6 лет назад 0
Ссылка исправлена ​​..... DavidPostill 6 лет назад 0

1 ответ на вопрос

3
LotPings

Пункт 1 из вашего заключения:

Вместо того чтобы выбирать только форматы файлов .mkv, .mp4 и .avi, скрипт выбирает все типы файлов.

Ясно из команды

dir *.mp4,*.mkv,*.avi /b /s /a-d %1 

Это инициирует 4 сканирования, 3 из текущего каталога с соответствующими расширениями и одно для переданного значения% 1

Я предлагаю вам сначала сделать, CD /D "%~1"чтобы каталог работал из этого места.

@echo off  setlocal CD /D "%~1" :: Create numbered list of files in a temporary file set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt" dir /b /s /a-d *.mp4,*.mkv,*.avi | findstr /n "^" >"%tempFile%" & REM " 
Вау, отличный улов, большое спасибо за это. Я знал, что это будет так просто, я действительно не должен был пропустить это. Интересно, есть ли какая-то конкретная причина, по которой вы использовали `"% ~ 1 "`? Поскольку добавление `~` просто расширяет переменную без кавычек, не могли бы вы просто сослаться на переменную без кавычек с `% 1`? Я протестировал скрипт с использованием `% 1` и подтвердил, что он работает, поэтому мне интересно, есть ли у него какие-либо недостатки в использовании? Hashim 6 лет назад 0
Это просто привычка - если не знать точно, что передается. Если всегда заключать в кавычки, они могут быть удвоены, так что включение и удаление в конечном итоге существующих кавычек гарантирует, что новое переданное значение будет заключено в кавычки. LotPings 6 лет назад 0
Мне нравится эта привычка с тильдой ... Я использую это большую часть времени на всякий случай, потому что у меня никогда не было проблем с этим, но у меня их не было. +1 Pimp Juice IT 6 лет назад 1