Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件播放列表随机排序_Batch File - Fatal编程技术网

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的机会!:-)

但是,如果您坚持批量生产,如果我要尝试,我会采取以下一般方法:

  • 计算文件夹中的.avi文件数
  • 在0和该数字之间选择一个随机数。例如,
    set/a randomLineNum=%random%%%10
    将%randomLineNum%设置为0到9之间的数字
  • 在('dir/s/o:n/b*.avi')…中为/f“skip=%randomLineNum%”%%L使用类似于
    的内容来获取该随机行,以及
    echo%%L>Playlist.m3u
  • 回到#2
  • 这种过于简单的方法最终会产生重复的结果,我没有以任何方式构建以退出循环。我把这些问题留给你们去解决(或者在将来的问题中提出)

    @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