目标
我的电脑本地存储着相当丰富的媒体收藏,它们位于两个父文件夹(“电影”和“节目”)。我的目标是能够随机播放这些文件夹中的任何一部电影或剧集,只需右键单击父文件夹并从扩展上下文菜单中选择“播放随机电影/剧集”项即可。
批处理脚本
我的 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\""
我被困的地方
该注册表项似乎运行良好 - 该项显示在文件夹的扩展上下文菜单中:
...单击后,它会运行批处理文件。问题在于脚本的执行。
该脚本不仅仅选择
.mkv
、.mp4
和文件格式,而是选择所有文件类型。.avi
它不是在目标文件夹(即从右键菜单中选择运行脚本的文件夹)中搜索、列出和选择文件,而是在看似目标文件夹的父文件夹和所有子文件夹中运行。因为在这种情况下,目标文件夹位于用户文件夹目录下,这实际上意味着它会从整个用户驱动器中随机选择文件。
尽管该脚本使用dir *.mp4,*.mkv,*.avi /b /s /a-d %1
枚举文件(其中%1
是目标文件夹的参数)但这些问题仍然存在。
脚本为何没有按预期运行?我错过了什么?
答案1
结论中的第 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 "