首先,在用於在批處理文件迴路必須與前面的變量名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]
我不明白你的第四這一行。你想檢查行是否在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。
你想得到播放列表中文件大小的總和嗎? –
是的!我試圖獲取音樂播放列表的總文件大小。 – mk117
1.不要猜測語法,學習它!在命令提示符窗口中輸入'for /?'以瞭解它的工作原理;對'set'和'if'做同樣的事情。 2.沒有像「AND」和「OR」這樣的關鍵字;然而,你可以做一些事情,如'如果一個EQU 1如果b EQU 2 ...'創建一個邏輯'AND'。 – aschipfl