我试图在目录中找到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
来比较3rd
和:
字符,检查文件路径格式是否为\
格式resources :triviabuilders
。然后为m3u播放列表文件中的每个文件添加文件大小。因此PlaylistsList.txt中的输出:
Rock.m3u [900 mb]
Electronic.m3u [500 mb]
Acoustic.m3u [150 mb]
答案 0 :(得分:2)
首先,批处理文件中for循环中的变量名必须以2 %
开头。因此,在变量中插入更多百分号。其次,将您的块放在括号()
内,而不是{}
另一个问题是你的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
要子字符串,首先将值分配给普通变量:set line=%%L
。要检查这两个条件,有几种解决方法like this,但您的情况只是检查单个字符串,因此您不需要检查单独的字符。如果您想要上述行为,请使用if "!line:~1,2!"==":\"
,或if /i "!line:~0,2!"=="C:\music\"
检查您提到的文件夹,使用/i
进行不区分大小写的检查。 for循环中的变量必须用!!
包围,以使其在运行时展开。请记住在开头使用setlocal EnableDelayedExpansion
。
最后你不需要& echo.
因为echo在打印后总是会换行。但是,您必须使用>>
附加输出文件,否则每次重定向echo
时都会删除旧内容。
现在要制作文件大小,你需要自己做数学运算,因为filesize只是一个数值。请注意,没有名为mb
的数据大小单位。如果你想要MiB(Windows术语中的MB)并除以1000得到MB,则除以1024。
所以脚本应该是这样的
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位signed int,因此如果总大小超过2GB,它将无法工作。
答案 1 :(得分: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