1

我在 NAS 盒子上收藏了大量电视连续剧,通过 samba 和 dlna 在我家中共享媒体。为了启用随机功能,我创建了一个如下的批处理脚本来制作播放列表文件:

    @Echo Off
    color 0e
    Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING ALL BAT, TXT, M3U, SRT and JPG FILES
    del "playlist.m3u"
    Setlocal EnableDelayedExpansion
    set _tmp=%1
    Set _t0=1
    If ["%CD%"]==["%CD:~0,3%"] Set _t0=0
    For /F "tokens=*" %%A In ('Dir "%*" /a-d /b /on /s ^|find /v ".bat"^|  find /v ".m3u"^|find /v ".txt"^| find /v ".srt"^|find /v ".jpg"') Do (
   Set _t1=%%A
   Set _t2=!_t1:%CD%=!
   Echo !_t2:~%_t0%!)>>playlist.m3u

所以,我在每个目录(每个电视节目一个)以及父文件夹(TV)中都有这些批处理文件之一,我的用户可以在他们喜欢的 WMP、VLC 或 w/e 播放器中启用随机,只需单击播放列表随机观看任何东西,或者更具体地说是特定节目的随机剧集。

那么,关于我的问题:为什么我的管道输出不是按字母顺序排列的?我真的很想在 MS-DOS / CMD 中完成这项工作,因为编程不是我的专长,这几乎是我编写脚本或其他任何东西的能力的限制。我想 FIND 命令可以更优雅地用于过滤掉特定的文件类型,我怀疑这就是我尝试对输出进行排序的问题。即使是特定于节目的播放列表似乎也有随机排序顺序(季节内的文件是按字母顺序排列的,但季节顺序似乎是随机的)输出过程。

任何帮助,将不胜感激。

-TJ

4

3 回答 3

0

See if this does what you need. Give an example playlist if it needs tweaking.

@Echo Off
color 0e
Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING ALL BAT, TXT, M3U, SRT and JPG FILES
del "playlist.m3u" 2>nul
For /F "delims=" %%A In (' Dir "%*" /a-d /b /on /s ^|findstr /v /i ".bat .m3u .txt .srt .jpg" ^|sort ') Do (
Echo %%~pnxA
>>playlist.m3u Echo %%~pnxA
)
于 2013-08-29T00:34:41.950 回答
0

我知道已经有一段时间了,但这是生成我想要的输出的最终批处理脚本:

@Echo Off
color 0e
Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING BAT, TXT, M3U, SRT and JPG FILES
del "playlist.m3u"
Setlocal EnableDelayedExpansion
Set _t0=1
If ["%CD%"]==["%CD:~0,3%"] Set _t0=0
For /F "tokens=*" %%A In ('Dir "%*" /a-d /b /on /s ^|findstr /v /i ".bat .m3u .txt .srt .jpg"^| sort') Do (
Set _t1=%%A
Set _t2=!_t1:%CD%=!
Echo !_t2:~%_t0%!)>>playlist.m3u

很抱歉我花了这么长时间才回到这里,但你知道,生活有时会妨碍你。请在下面找到我想要的输出示例。这种方式的文件列表用作 .m3u 播放列表,无论文件夹是否映射到驱动器号,都将在网络位置播放。无论用户决定映射文件夹层次结构中的哪个位置,它都可以工作。例子:

Z:\md0\media\tv\30 rock\season 1\s01e01.avi
or
y:\tv\30 rock...
or
r:\30 rock...
or even
\\tjmediaserver\video\tv\30 rock\...

都是用户在此位置访问我的开放网络共享的有效方式。样本批量输出:

Season 1\30 Rock S01E01 Pilot.avi
Season 1\30 Rock S01E02 The Aftermath.avi
Season 1\30 Rock S01E03 Blind Date.avi

Windows Media Player 和 VLC(仅我们使用的播放器)都假定文件位于存储 .m3u 的子目录中。如果我想从头开始观看节目“X”,或者在我的媒体播放器中启用随机播放并观看随机“x”或随机“x”和“y”,这很方便。

于 2014-01-21T00:41:10.240 回答
0

唔..

第一点 - 如果您的意图是进行各种“随机”选择,为什么需要按字母顺序排列?

下一步 - 你为什么要设置_tmp- 你没有使用它。
Next - 你的括号IF "%CD%"...是多余的 - 引号告诉批处理字符串可能包含分隔符
Next -/on开关告诉DIR按字母顺序输出 SELECTED 目录。
下一个 -_t0似乎打算选择“lop 0”或“lop 1”字符,但DIR /s /b输出将是X:\dir...\filename- 看起来不是特别明智......
下一个 - 您似乎省略了命令中的/i开关以说明情况-不敏感。FINDfind

你没有显示你的目录结构,所以“季节顺序”是模糊的。大概你有..\showname\season\episode。考虑一下当你有第 1,2..10,11 季时会发生什么。如果排序,您将得到 1,10,11,2.. 相同的评论可能适用于您的剧集名称。

这是一种生成排序列表的方法。在这种情况下,它将检测包含with在当前所有子目录中的文件,在任何情况下减去选定的扩展名 - 因为我的批处理测试目录中有合理数量的包含withand &(也是!and )的文件名。另请注意,在没有该方法%的情况下会创建一个新文件。delete and append输出文件名也不同 - 并且DELAYEDEXPANSION未被调用。

@ECHO OFF
SETLOCAL 
(
 For /F "tokens=*" %%A In ('Dir "*with*" /a-d /b /s ^|find /i /v ".bat"^|  find /i /v ".m3u"^|find /i /v ".txt"^| find /i /v ".srt"^|find /i /v ".jpg"^|sort') Do (
ECHO %%A
 )
)>newfile.txt
GOTO :EOF

您没有说在哪里&破坏了您的代码。这种结构并不在意——&和其他困难的角色表现得非常愉快。也许您的困难在于您显示的代码部分 - 也许他们稍后会...

最后,DIR相对简单,不允许按名称排除。可能更优雅的方法是使用

xcopy /y /L /s sourcedir x:\nul\

实验的问题。XCOPY /?从文档提示 - 这将显示如何使用/exclude:开关。但有两个注意事项 - 该xcopy方法将选择目录名称,最后一行将是列表中的文件计数。

 if not exist "%%A\." if exist "%%A" ECHO %%A

应该克服这两个问题。

于 2013-08-28T03:23:20.387 回答