从随机文件选择中排除某些文件扩展名 - 批处理脚本

时间:2016-02-16 16:05:38

标签: batch-file playlist

我正在编写一个脚本,从用户指定的文件夹中选择25个随机曲目,然后将它们添加到.m3u播放列表中。我遇到的麻烦是我的音乐文件夹也包含各种其他文件(例如:.txt,.jpg,.png,.nfo等...)

所以我正在寻找一种排除上面列出的扩展的方法,将脚本限制为仅使用音频文件。任何帮助将不胜感激!

这是迄今为止的代码......它已经从各种来源拼凑而成,所以如果它有点粗糙,请接受我的道歉:

@echo off
title Multiple Choice Menu
:home
cls
echo.
echo Select a genre:
echo =============
echo.
echo 1) Jungle
echo 2) D'n'B
echo 3) Reggae
echo 4) Hip-Hop
echo 5) Exit
echo.
set /p genre=Type option:
if "%genre%"=="1" cd /D "D:\NL Safe 2.0\High Quality\Jungle"
if "%genre%"=="2" cd /D "D:\NL Safe 2.0\High Quality\DnB\Standard DnB"
if "%genre%"=="3" cd /D "D:\NL Safe 2.0\High Quality\Reggae
if "%genre%"=="4" cd /D "D:\NL Safe 2.0\High Quality\Hip-Hop"
if "%genre%"=="5" exit

:: Clear existing Playlist
@echo. > C:\Users\Brew\Desktop\random.m3u 

:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir /b /s /a-d %1 | findstr /n "^" >"%tempFile%"

:: Count the files
for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N

:: Open 25 random files
for /l %%N in (1 1 25) do call :openRandomFile

:: Delete the temp file
del "%tempFile%"

:openRandomFile
set /a "randomNum=(%random% %% cnt) + 1"
for /f "tokens=1* delims=:" %%A in (
  'findstr "^%randomNum%:" "%tempFile%"'
) do (
  setlocal EnableDelayedExpansion
  set tune=%%B
  @echo !tune! >> C:\Users\Brew\Desktop\random.m3u
)

3 个答案:

答案 0 :(得分:0)

假设您的歌曲文件夹位于%1

dir命令支持

中的通配符
dir *.txt *.xml

只会列出.txt.xml个文件。

所以你可以尝试这样做:

...
:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
pushd %1
dir /b /s /a-d *.mp3 *.EXT1 *.EXT2 | findstr /n "^" >"%tempFile%"
popd
...

EXT将成为您想要匹配的扩展程序。

这将仅使用您想要的文件创建%tempFile%。正如我所看到的那样,选择文件ramdomly的代码在这个文件中起作用,它根本不需要改变。

我无法使用目标目录和通配符。

希望它有所帮助。 这就是我使用pushdpopd

的原因

答案 1 :(得分:0)

谢谢Daniel,

我还有另一个去做,终于有了自己的工作。我使用一系列If语句将随机文件放入扩展验证检查

这是工作脚本

@echo off
title Multiple Choice Menu
:home
cls
echo.
echo Select a task:
echo =============
echo.
echo 1) Jungle
echo 2) D'n'B
echo 3) Reggae
echo 4) Hip-Hop
echo 5) Exit
echo.
set /p genre=Type option:
if "%genre%"=="1" cd /D "D:\NL Safe 2.0\High Quality\Jungle"
if "%genre%"=="2" cd /D "D:\NL Safe 2.0\High Quality\DnB\Standard DnB"
if "%genre%"=="3" cd /D "D:\NL Safe 2.0\High Quality\Reggae
if "%genre%"=="4" cd /D "D:\NL Safe 2.0\High Quality\Hip-Hop"
if "%genre%"=="5" exit

:: Clear existing Playlist
@echo. > C:\Users\Brew\Desktop\random.m3u 

:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir /b /s /a-d %1 | findstr /n "^" >"%tempFile%"

:: Count the files
for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N

:openRandomFile
echo opening random file.....
set /a "randomNum=(%random% %% cnt) + 1"
for /f "tokens=1* delims=:" %%A in (
  'findstr "^%randomNum%:" "%tempFile%"'
) do (
  setlocal EnableDelayedExpansion
  set tune=%%B

FOR %%i IN ("!tune!") do call :CheckifMusic
)


:CheckifMusic
echo checking now
FOR %%i IN ("!tune!") DO (
SET fileextension=%%~xi
IF !fileextension!==.aif goto ResultTrue
IF !fileextension!==.flac goto ResultTrue
IF !fileextension!==.m4a goto ResultTrue
IF !fileextension!==.mp3 goto ResultTrue
IF !fileextension!==.wav goto ResultTrue
IF !fileextension!==.wma goto ResultTrue

echo fail
echo !fileextension!
goto openRandomFile


:ResultTrue
echo pass
echo !fileextension!
@echo !tune! >> C:\Users\Brew\Desktop\random.m3u
set /A COUNTER=COUNTER+1
IF !COUNTER!==25 (
  echo finished
  pause
  goto Done
) ELSE (
goto openRandomFile
)


:Done
echo.
:: Delete the temp file
del "%tempFile%"
exit
)
pause 

可能不是最干净的方法,但是嘿 - 它有效!

答案 2 :(得分:0)

替换

dir /b /s /a-d %1 | findstr /n "^" >"%tempFile%"

dir /b /s /a-d %1 | findstr /n /L /E /I /c:".mp3" /c:".wav">"%tempFile%"

/c:".mp3"...可以根据您希望选择目标文件类型的次数进行扩展。

dir /b /s /a-d %1 | findstr /n /V /L /E /I /c:".jpg" /c:".txt">"%tempFile%"

再次重复/c:".jpg"...次,因为您希望选择目标排除我文件类型。

/i表示"不区分大小写",/e表示"在该行的末尾" /L表示"字面匹配,而不是正则表达式"并且/v表示"输出不匹配"