2016-03-29 50 views
0

我正在嘗試在目錄中查找m3u播放列表文件的文件大小。我不知道批處理腳本的正確語法,所以下面的代碼可能無法正常運行。 我需要關於這個腳本的幫助。如何在批處理腳本中查找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. 第二行設置一個變量文件大小爲0,所以它不會保存在每個循環得到補充。
  3. 第三行將每個m3u播放列表文件作爲文本文件輸入在另一個循環中處理。
  4. 第四行檢查,如果文件路徑格式是"C:\music\"格式,通過經由: & \2nd3rd字符進行比較。然後爲m3u播放列表文件中的每個文件添加文件大小。
  5. 最後的文件名與文件大小沿着迴盪..

因此,輸出在PlaylistsList.txt:

Rock.m3u [900 mb]

Electronic.m3u [500 mb]

Acoustic.m3u [150 mb]

+0

你想得到播放列表中文件大小的總和嗎? –

+0

是的!我試圖獲取音樂播放列表的總文件大小。 – mk117

+1

1.不要猜測語法,學習它!在命令提示符窗口中輸入'for /?'以瞭解它的工作原理;對'set'和'if'做同樣的事情。 2.沒有像「AND」和「OR」這樣的關鍵字;然而,你可以做一些事情,如'如果一個EQU 1如果b EQU 2 ...'創建一個邏輯'AND'。 – aschipfl

回答

2

首先,在用於在批處理文件迴路必須與前面的變量名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] 

我不明白你的第四這一行。你想檢查行是否在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 

一個重要的說明是,在設置中使用的變量是32位有符號整數,所以不會,如果總規模工作超過2GB。

+0

非常感謝Luu!一個小問題,我在我的txt文件中得到'%f [0 MB]'的附加輸出,並且通過'pause',我發現由於我的m3u文件名有空格,因此腳本無法找到m3u文件!錯誤:'無法找到文件「文件夾」'(雖然我的m3u文件可能是'文件夾1'..我試着在第二個循環之前設置f =「f」',並且仍然出現錯誤 – mk117

+0

啊你需要'set f =「%% f」'然後使用'%f%'代替 –

+0

嗯,我不明白,我通過添加''tokens = * delims =「'來解決它for循環。問題在於批處理腳本沒有將'.m3u'文件作爲文本處理,文件名出現在echo中,但'%% L'只顯示'%L',雖然文件未打開,但出現了m3u文件名由劇本。第二個循環中的'%% f'被視爲字符串,而不是文件。 – mk117

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 
+0

不需要在'!!'中放置文件大小,因爲你不會在循環中改變它的值 –

+0

好吧,文件大小沒有以文本大小顯示,所以我閱讀了關於變量如何包含在雙'!!'標記。 – mk117

+0

我忘了你把尺寸放在外部循環裏 –

相關問題