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

时间:2016-03-29 09:29:31

标签: windows batch-file windows-10 batch-processing

我试图在目录中找到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
}
  1. 第一行扫描基目录中的m3u文件,
  2. 第二行将变量filesize设置为0,这样就不会在每个循环中添加变量。
  3. 第三行将每个m3u播放列表文件作为文本文件输入,以便在另一个循环中进行处理。
  4. 第四行通过"C:\music\"2nd来比较3rd:字符,检查文件路径格式是否为\格式resources :triviabuilders 。然后为m3u播放列表文件中的每个文件添加文件大小。
  5. 最后,文件名与文件大小一起回显..
  6. 因此PlaylistsList.txt中的输出:

      

    Rock.m3u [900 mb]

         

    Electronic.m3u [500 mb]

         

    Acoustic.m3u [150 mb]

2 个答案:

答案 0 :(得分:2)

首先,批处理文件中for循环中的变量名必须以2 %开头。因此,在变量中插入更多百分号。其次,将您的块放在括号()内,而不是{}

另一个问题是你的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时都会删除旧内容。

现在要制作文件大小,你需要自己做数学运算,因为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