如何在批处理脚本中查找 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\"
格式,通过:
和\
比较2nd
和3rd
字符。然后为 m3u 播放列表文件中找到的每个文件添加文件大小。
最后,文件名与文件大小一起回显。
因此在 PlaylistsList.txt 中的输出:
Rock.m3u [900 mb]
Electronic.m3u [500 mb]
Acoustic.m3u [150 mb]
【问题讨论】:
你想得到播放列表中文件大小的总和? 是的!我正在尝试获取音乐播放列表的总文件大小。 1.不要猜测语法,学习它!在命令提示符窗口中输入for /?
以了解其工作原理;对set
和if
执行相同的操作。 2、没有AND
、OR
等关键字;但是,您可以执行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=0
或SET "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 播放列表文件大小?的主要内容,如果未能解决你的问题,请参考以下文章
windows 批处理 .bat 自动 .m3u 播放列表创建/更新