我正在尝试在目录中查找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
}
"C:\music\"
来比较2nd
and3rd
字符,检查文件路径格式是否为格式。然后,为在m3u播放列表文件中找到的每个文件添加文件大小。:
\
因此,PlaylistsList.txt中的输出为:
Rock.m3u [900 mb]
Electronic.m3u [500 mb]
Acoustic.m3u [150 mb]
首先,批处理文件中for循环中的变量名称必须以2 %
s开头。因此,请在变量中插入更多百分号。其次,将您的图块放在括号内()
,而不是{}
另一个问题是您的set
命令。set中的变量名称不能用百分号括起来,并且分配的值必须在等号之后,否则您变量的实际值将包含前面的空格。正确的方法是这样的:SET filesize=0
或SET "filesize=0"
您还要一次又一次地添加第一个参数的文件大小(注意,z1
此处不是zi
%filesize% = %filesize% + %~z1
您必须使用获取列表中文件的大小,%~zi
并将其添加到总和中。但是,您不能像上面那样直接进行数学运算。使用set /a
替代
set /a filesize += %%~zi
而且您正在错误地读取m3u文件内容。要从文本文件中读取一行,请使用这种方式
for /F "tokens=*" %%L in (%%f) do [command]
我不明白你在这行中的第4条。您想检查行是否以开头,C:\music\
但是您要检查第二个字符是否是:
,第三个字符是否是\
。这有几个问题:
IF
不支持多种条件,例如 AND
要子字符串化,请先将值分配给普通变量:set line=%%L
。要检查这两种情况,有几种类似的解决方法,但是您的情况只是检查单个字符串,因此您无需检查单独的字符。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
一个重要的注意事项是,inset
中使用的变量是32位有符号的int,因此,如果总大小超过2GB,它将不起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句