从其上下文菜单中播放文件夹中的随机电影/剧集

Has*_*ziz 5 windows windows-explorer context-menu batch-file random-number-generator

目标

我在我的机器上本地存储了一个相对广泛的媒体集,位于两个父文件夹(“电影”和“节目”)中。我的目标是通过右键单击父文件夹并从扩展上下文菜单中选择“播放随机电影/剧集”项目,能够随机播放这些文件夹中的任何一部电影或剧集。

批处理脚本

我有以下批处理脚本存储在我的 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
Run Code Online (Sandbox Code Playgroud)

上下文菜单项

为了添加一个扩展的上下文菜单项来运行上面的批处理文件,我创建了以下注册表项,这会导致文件夹上的上下文菜单项在单击时指定的路径上运行批处理文件。

[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\""
Run Code Online (Sandbox Code Playgroud)

我被困在哪里

注册表项似乎工作得很好 - 该项目显示在文件夹的扩展上下文菜单中:

在此处输入图片说明

...当点击时,它运行批处理文件。问题在于脚本的执行。

  1. 该脚本不只选择.mkv,.mp4.avi文件格式,而是选择所有文件类型。

  2. 不是在目标文件夹中搜索、列出和选择文件 - 从其右键单击上下文菜单中选择脚本运行的文件夹 - 它运行在似乎是目标文件夹和所有子文件夹的父文件夹上. 因为在这种情况下目标文件夹在用户文件夹目录下,这实质上意味着它从整个用户驱动器中随机选择文件。

尽管脚本用于dir *.mp4,*.mkv,*.avi /b /s /a-d %1枚举文件,%1目标文件夹的参数在哪里,但这些问题仍然存在。

为什么脚本没有按预期工作?我在这里错过了什么?

Lot*_*ngs 5

您的结论中的第 1 点:

该脚本不只选择 .mkv、.mp4 和 .avi 文件格式,而是选择所有文件类型。

从命令中可以清楚地看出

dir *.mp4,*.mkv,*.avi /b /s /a-d %1
Run Code Online (Sandbox Code Playgroud)

这将启动 4 次扫描,3 次来自具有各自扩展名的当前目录,1 次用于传递的 %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 "
Run Code Online (Sandbox Code Playgroud)