DIR命令的输出与批处理文件中的预期不同

时间:2013-08-28 01:41:17

标签: windows batch-file cmd command dir

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

    @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命令可以更优雅地用于过滤掉特定的文件类型,我怀疑其中存在我尝试对输出进行排序的问题。即使是特定于节目的播放列表似乎也有一个随机排序顺序(季节内的文件是按字母顺序排列的,但季节顺序似乎是随机的)我还想知道是否有人可以通过“&”来获取文件夹。在名称不打破输出过程。

任何帮助都将不胜感激。

-T.J。

3 个答案:

答案 0 :(得分:0)

嗯..

第一点 - 如果你打算做各种各样的"随机"你为什么需要字母顺序?选择?

下一步 - 你为什么设置_tmp - 你没有使用它。
接下来 - IF "%CD%"...中的括号是多余的 - 引号用于告诉批处理字符串可能包含分隔符
接下来 - /on开关告诉DIR按字母顺序输出SELECTED目录 下一步 - _t0似乎是为了选择' lop 0'或者' lop 1'字符,但DIR /s /b输出将为X:\dir...\filename - 并不是特别明智的... 接下来 - 您似乎已从/i命令中省略了FIND切换,以使find不区分大小写。

您还没有显示您的目录结构,所以"季节顺序"是模糊的。大概你有...... \ showsame \ season \ episode。考虑当你有赛季1,2..10,11时会发生什么。如果已排序,您将获得1,10,11,2 ..同样的评论可能适用于您的剧集名称。

这是一种生成排序列表的方法。在这种情况下,它会在当前所有子目录中检测包含with的文件,在任何情况下都会检测所选扩展名 - 因为我有合理数量的文件名包含with和{{1我的批处理测试目录中的(&!)。另请注意,创建的新文件没有%方法。输出文件名也不同 - 并且不调用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

应该克服这两个问题。

答案 1 :(得分:0)

看看这是否符合你的需要。如果需要调整,请提供示例播放列表。

@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
)

答案 2 :(得分: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”,我会很方便。