如何在批处理脚本中查找 m3u 播放列表文件大小?

Posted

技术标签:

【中文标题】如何在批处理脚本中查找 m3u 播放列表文件大小?【英文标题】:How to find m3u playlist filesize in batch script? 【发布时间】:2016-07-16 18:38:10 【问题描述】:

我正在尝试在目录中查找 m3u 播放列表文件的文件大小。我不知道批处理脚本的正确语法,所以下面的代码可能无法正常运行。

我需要有关此脚本的帮助。

FOR /f %f in ('dir /b') DO 
  SET %filesize% = 0
  FOR /F %i in (%f) DO 
   If %i~1,1% equ ":" AND %i~2,1% equ "\" (%filesize% = %filesize% + %~z1)
  
 echo %f [%filesize%] & echo. > PlaylistsList.txt

    第一行扫描基目录中的 m3u 文件, 第二行将变量文件大小设置为 0,这样它就不会在每个循环中不断添加。 第三行将每个 m3u 播放列表文件作为文本文件输入,以便在另一个循环中处理。 第四行检查文件路径格式是否为"C:\music\" 格式,通过:\ 比较2nd3rd 字符。然后为 m3u 播放列表文件中找到的每个文件添加文件大小。 最后,文件名与文件大小一起回显。

因此在 PlaylistsList.txt 中的输出:

Rock.m3u [900 mb]

Electronic.m3u [500 mb]

Acoustic.m3u [150 mb]

【问题讨论】:

你想得到播放列表中文件大小的总和? 是的!我正在尝试获取音乐播放列表的总文件大小。 1.不要猜测语法,学习它!在命令提示符窗口中输入for /? 以了解其工作原理;对setif 执行相同的操作。 2、没有ANDOR等关键字;但是,您可以执行if a EQU 1 if b EQU 2 ... 之类的操作来创建逻辑AND 好的。谢谢!我将尝试从命令提示符中学习语法。 【参考方案1】:

根据 Luu 的回答更正!

setlocal EnableDelayedExpansion

for /f "tokens=* delims=" %%f in ('dir *.m3u /b') DO (
    set filesize=0
    REM set var1="%%f"
    REM echo %var1%
    for /f "useback tokens=* delims=" %%L in ("%%~f") do (
        set line=%%L
        if "!line:~1,2!"==":\" set /a filesize += %%~zL
    )
    REM set /a filesize /= 1024
    echo %%f [!filesize! MB] >> PlaylistsList.txt
)
pause

【讨论】:

无需将文件大小放入!!,因为无论如何您都不会在循环中更改它的值 好吧,文件大小没有显示在文本大小中,所以我阅读了您关于如何将变量包含在双 !! 标记之间的解释。 我忘了你把尺寸放在外循环里面【参考方案2】:

首先,批处理文件中for循环中的变量名必须以2个%s开头。所以在你的变量中插入更多的百分号。其次,把你的块放在括号内(),而不是


另一个问题是你的set 命令。 set 中的变量名不被百分号包围,并且赋值必须紧跟在等号之后,否则你的变量的实际值将包含前面的空格。正确的做法是这样的:SET filesize=0SET "filesize=0"

您还一次又一次地添加第一个参数的文件大小(注意 z1 那里而不是 zi

%filesize% = %filesize% + %~z1

您必须使用%~zi 获取列表中文件的大小并将其添加到总和中。但是,您不能像上面那样直接进行数学运算。请改用set /a

set /a filesize += %%~zi

而且您正在错误地读取 m3u 文件内容。给read a line from a text file这样用

for /F "tokens=*" %%L in (%%f) do [command]

我不明白你的第 4 行。您想检查该行是否以 C:\music\ 开头,但您要检查第二个字符是否为 : 而第三个字符是否为 \。这有几个问题:

IF 不支持多个条件,例如 AND 您不能在 for 循环中为变量添加子字符串,因为它不像普通变量那样被百分号包围。

要子字符串,首先将值分配给普通变量:set line=%%L。要检查这两种情况,有几种解决方法like this,但您的情况只是检查单个字符串,因此您不需要检查单独的字符。如果您想要上述行为,请使用if "!line:~1,2!"==":\",或使用if /i "!line:~0,2!"=="C:\music\" 检查您提到的文件夹,使用/i 进行不区分大小写的检查。 for 循环中的变量必须用!! 包围,以使其在运行时扩展。记得在开头使用setlocal EnableDelayedExpansion

最后你不需要& echo.,因为 echo 总是在打印后换行。但是你必须使用>> 附加输出文件,否则每次重定向echo 时它都会删除旧内容。


现在要制作文件大小,您需要自己计算,因为文件大小只是一个数值。请注意,没有称为mb 的数据大小单位。如果你想要 MiB(Windows 术语中的 MB)除以 1024,然后除以 1000 得到 MB。

所以脚本应该是这样的

setlocal EnableDelayedExpansion

for /f %%f in ('dir /b') DO (
    set filesize=0
    for /F "tokens=*" %%L in (%%f) do (
        set line=%%L
        if "!line:~1,2!"==":\" set /a filesize += %%~zL
    )
)
set /a filesize /= 1024
echo %%f [%filesize% MB] >> PlaylistsList.txt

奖励:如果需要四舍五入的文件大小结果,请使用

set divisor=1024
set /a filesize = (%filesize% + %divisor%/2) / %divisor%

编辑:

为了适应长文件名,第二个 for 循环应该像这样与usebackq 一起使用

for /F "usebackq tokens=*" %%L in ('%%f') do (

另一种方法是调用另一个函数来获取文件大小

set line=%%L
CALL :FileSize "%%L"
if "!line:~1,2!"==":\" set /a filesize += %%~zL

:FileSize
SET filesize=%~z1

一个重要的注意事项是set 中使用的变量是 32 位有符号整数,因此如果总大小超过 2GB,它将不起作用

【讨论】:

谢谢卢!一个小问题,我在我的 txt 文件中得到了%f [0 MB] 的附加输出,通过pause 我发现由于我的 m3u 文件名有空格,因此脚本无法找到 m3u 文件!错误:Cannot find the file "Folder"(而我的 m3u 文件可能是 Folder 1.. 我在第二个 for 循环之前尝试了 set f="f",但仍然出现错误。 啊,你需要set f="%%f",然后改用%f% 好吧,我不明白。我通过在 for 循环中添加 "tokens=* delims=" 来解决它。另外,另一个问题是批处理脚本没有将.m3u 文件视为文本。文件名出现在回显中,但%%L 仅显示%L,尽管脚本未打开文件,但出现m3u 文件名。第二个 for 循环中的 %%f 被视为字符串,而不是文件。 嗨!我终于让脚本工作了......我即将发布它作为答案,请根据该脚本更正您的代码,以便我可以选择您的答案作为这个问题的答案!谢谢! 好吧,useback 通过此评论中链接的问题页面解决了文件名被视为字符串的问题。

以上是关于如何在批处理脚本中查找 m3u 播放列表文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

批处理多个 m3u 文件

windows 批处理 .bat 自动 .m3u 播放列表创建/更新

如何获取 m3u8 文件的真实大小

求助,m3u8视频文件获取MP4视频方法

使用 jQuery 在浏览器中播放 .m3u 播放列表的方法

在批处理脚本中检查文件大小