Batch file 批处理文件播放列表随机排序
我已经整理了一个小批量文件程序来创建一个播放列表Batch file 批处理文件播放列表随机排序,batch-file,Batch File,我已经整理了一个小批量文件程序来创建一个播放列表 @echo off DIR /S /o:n /b *.avi > Playlist.m3u 有没有办法改变它,使它在每次运行时都能按随机顺序排序?这是可以做到的,但不会很漂亮!你能用更好的平台代替批处理文件吗?也许这正是您一直在等待的学习Powershell的机会!:-) 但是,如果您坚持批量生产,如果我要尝试,我会采取以下一般方法: 计算文件夹中的.avi文件数 在0和该数字之间选择一个随机数。例如,set/a randomLineNu
@echo off
DIR /S /o:n /b *.avi > Playlist.m3u
有没有办法改变它,使它在每次运行时都能按随机顺序排序?这是可以做到的,但不会很漂亮!你能用更好的平台代替批处理文件吗?也许这正是您一直在等待的学习Powershell的机会!:-) 但是,如果您坚持批量生产,如果我要尝试,我会采取以下一般方法:
set/a randomLineNum=%random%%%10
将%randomLineNum%设置为0到9之间的数字的内容来获取该随机行,以及echo%%L>Playlist.m3u
@ECHO关闭
SETLOCAL ENABLEDELAYEDEXPANSION
::
::建立临时文件名
::
:temploop
SET tempfile=“%temp%\temp%random%.tmp”
如果存在%tempfile%GOTO temploop
::
::编写每个文件名的文件名列表
::前缀为随机数和冒号
::
(对于/f“delims=“%%i IN(
“dir/s/b*.avi”
)做回显!随机!:%%i
)>%临时文件%
::
::编写播放列表。
::对临时文件进行排序(放置临时文件的位置)
::以随机顺序)并删除数字:
::
(对于/f“tokens=1*delims=:”%i IN(
'sort^不带临时文件的解决方案:
@echo off &setlocal
set "playlist=Playlist.m3u"
del %playlist% 2>nul
set /a files=0
for %%i in (*.avi) do set /a files+=1
if %files% equ 0 (echo No AVI found&goto:eof) else echo %files% AVI's found.
set /a cnt=%files%-1
for /l %%i in (0,1,%cnt%) do for /f "delims=" %%a in ('dir /b /a-d *.avi^|more +%%i') do if not defined $avi%%i set "$avi%%i=%%a"
:randomloop
set /a rd=%random%%%%files%
call set "avi=%%$avi%rd%%%"
if not defined avi goto :randomloop
set "$avi%rd%="
>>%playlist% echo %avi%
set /a cnt-=1
if %cnt% geq 0 goto:randomloop
echo Done!
endlocal
这不使用DelayedExpansion,因此它可以处理名称中带有感叹号的文件。这需要更多的时间,但也不需要临时文件
@echo off &setlocal
set "playlist=Playlist.m3u"
del %playlist% 2>nul
set /a files=0
for %%i in (*.avi) do set /a files+=1
if %files% equ 0 (echo No AVI found&goto:eof) else echo %files% AVI's found.
set /a cnt=%files%-1
for /l %%i in (0,1,%cnt%) do for /f "delims=" %%a in ('dir /b /a-d *.avi^|more +%%i') do if not defined $avi%%i set "$avi%%i=%%a"
:randomloop
set /a rd=%random%%%%files%
call set "avi=%%$avi%rd%%%"
if not defined avi goto :randomloop
set "$avi%rd%="
>>%playlist% echo %avi%
set /a cnt-=1
if %cnt% geq 0 goto:randomloop
echo Done!
endlocal