寫此代碼的初衷: 本人是電影愛好者,有上千部電影在同一個目錄movie下。 每部電影都單獨存在於一個檔案夾內,如 "鋼鐵俠" "極品飛車" "玩具總動員" 等, 每部電影大小不一,有的幾百兆,有的幾個G,所以我想在每個檔案夾名字的前面加上該部電影的大小,以G為單位取小數點後2位。
如下所示:
f:\01movie\1.21GB---決鬥猶馬鎮\決鬥猶馬鎮.srt
f:\01movie\0.35GB---科學怪人.mkv
f:\01movie\0.98GB---尼古拉斯·凱奇-狂暴飛車\狂暴飛車.mkv
f:\01movie\4.37GB---傑森·斯坦森-暫告安全\暫告安全.mkv
f:\01movie\7.93GB---我們曾是戰士\我們曾是戰士.mkv
本程式功能:
1,在每個檔案夾的前面,添加該檔案夾大小,以GB為單位
2,本程式可以正確處理帶驚嘆號的檔案夾,但是不能處理帶&符號的檔案夾,有待完善。
3,其實本程式也是記錄一下自己的bat學習曆程。對變數嵌套和變數擴充有了更進一步的認識。尤其是對setlocal enabledelayedexpansion 和 setlocal disabledelayedexpansion有了更深入的認識。後者我第一次在代碼裡面用上,解決了變數延遲開啟後驚嘆號丟失的問題。
再嘮叨一句,裡面的除法是調用vbs實現的,用bat做除法比較麻煩,尤其是GB TB這麼大的位元組數,所以就沒有寫那段代碼。
@echo off rem setlocal enabledelayedexpansionset jd=2set "dir=./"set /a KB=1024set /a MB=1024*1024set /a GB=1024*1024*1024set /a TB=1024*1024*1024*1024set TBTB=1099511627776rem 注意這裡我使用%curr_dir%來代替%cd%的原因是: rem 當批處理本身位於C: D: E:等根目錄下時,%cd% 的結果是 C:\ D:\ E:\ 有個反斜線在這裡,導致del /f /s /q %cd%\dir.txt的時候提示 "檔案名稱、目錄名或卷標文法不正確。"rem 這樣導致批處理的相容性比較差,所以:rem 使用%0來提取當前批處理的路徑,%curr_dir% 就沒有這個問題。echo current dir is %cd%;for %%i in (%0) do (set curr_dir=%%~dpi)echo current dir is %curr_dir%;echo "請選擇要計算的目錄類型,1是只取第一層目錄,2是遞迴目前的目錄,預設是第一層目錄"set /p "dir_type="if NOT DEFINED dir_type echo "dir_type is Null" && dir /a:d /b "%dir%" | sort /r> "%curr_dir%directory.txt" && goto continue_calcif %dir_type% EQU 1 echo "dir_type is 1" && dir /a:d /b "%dir%" | sort /r> "%curr_dir%directory.txt"if %dir_type% EQU 2 echo "dir_type is 2" && dir /a:d /b /s "%dir%" | sort /r> "%curr_dir%directory.txt":continue_calcif 324 LSS %TBTB% echo small.if 10995116277760 GTR %TB% echo big.if 23306286128 GTR %TB% echo big000.if 23306286128 LSS %TB% echo big111.del /f /s /q "%curr_dir%calc_1.vbs" >nul 2>nuldel /f /s /q "%curr_dir%dir_size.txt" >nul 2>nuldel /f /s /q "c:\vbs_result.txt" >nul 2>nulrem 使用vbs指令碼建立一個簡單的除法計算機。 echo Dim a1,a2,a3 > "%curr_dir%calc_1.vbs"echo Dim str1 >>"%curr_dir%calc_1.vbs"echo Dim a(2) >>"%curr_dir%calc_1.vbs"echo Dim i >>"%curr_dir%calc_1.vbs"echo i=0 >>"%curr_dir%calc_1.vbs"echo Set oArgs = WScript.Arguments >>"%curr_dir%calc_1.vbs"echo For Each s In oArgs >>"%curr_dir%calc_1.vbs"echo a(i)=s >>"%curr_dir%calc_1.vbs"echo i=i+1 >>"%curr_dir%calc_1.vbs"echo 'MsgBox(s) >>"%curr_dir%calc_1.vbs"echo Next >>"%curr_dir%calc_1.vbs"echo Set oArgs = Nothing >>"%curr_dir%calc_1.vbs"echo 'MsgBox(a(0)) >>"%curr_dir%calc_1.vbs"echo 'MsgBox(a(1)) >>"%curr_dir%calc_1.vbs"echo ' >>"%curr_dir%calc_1.vbs"echo a1=145555555555555555 >>"%curr_dir%calc_1.vbs"echo a2=1255555555.23 >>"%curr_dir%calc_1.vbs"echo a3=a(0)/a(1) >>"%curr_dir%calc_1.vbs"echo a3=round(a3,2) >>"%curr_dir%calc_1.vbs"echo If a3^<1 Then >>"%curr_dir%calc_1.vbs"echo str1 = 0^&a3 >>"%curr_dir%calc_1.vbs"echo If Len(str1) ^<4 Then str1 = str1^&"0" End if >>"%curr_dir%calc_1.vbs"echo Else >>"%curr_dir%calc_1.vbs"echo If a3^<100 Then >>"%curr_dir%calc_1.vbs"echo if Len(a3)^<4 then >>"%curr_dir%calc_1.vbs"echo if Len(a3)=1 then str1 = a3^&".00" end if '1 >>"%curr_dir%calc_1.vbs"echo if Len(a3)=2 then str1 = a3^&".0" end if '10 >>"%curr_dir%calc_1.vbs"echo if Len(a3)=3 then str1 = a3^&"0" end if '1.1 >>"%curr_dir%calc_1.vbs"echo else >>"%curr_dir%calc_1.vbs"echo str1=a3 '10.1 >>"%curr_dir%calc_1.vbs"echo If Len(str1) ^<4 Then str1 = str1^&"0" End if >>"%curr_dir%calc_1.vbs"echo End If >>"%curr_dir%calc_1.vbs"echo else magbox("Error! The folder is larger than 100GB") >>"%curr_dir%calc_1.vbs"echo End If >>"%curr_dir%calc_1.vbs"echo End If >>"%curr_dir%calc_1.vbs"echo ' >>"%curr_dir%calc_1.vbs"echo set fso=createobject("scripting.filesystemobject") >>"%curr_dir%calc_1.vbs"echo set fw=fso.createtextfile("c:\vbs_result.txt") >>"%curr_dir%calc_1.vbs"echo fw.write str1 >>"%curr_dir%calc_1.vbs"echo fw.write "GB---" >>"%curr_dir%calc_1.vbs"echo 'MsgBox(a3) >>"%curr_dir%calc_1.vbs"for /f "usebackq delims=" %%i in ("directory.txt") do (echo dir_is %%i;for /f "usebackq tokens=3 delims= " %%j in (`dir /s /a /-c "%%i" ^|findstr 個檔案`) do (setlocal enabledelayedexpansion set z=%%j ) echo 總大小:!z!位元組 if !z! GEQ %GB% ( if not exist "%curr_dir%calc_1.vbs" ( rem 處理父目錄存在驚嘆號的路徑,如果父目錄的路徑中存在驚嘆號,會被丟掉,因為開啟了變數延遲。 setlocal DISABLEDELAYEDEXPANSION echo parent folder not exist ....... because it contails !! copy "%curr_dir%calc_1.vbs" d:\ endlocal call "d:\calc_1.vbs" !z! %GB% setlocal DISABLEDELAYEDEXPANSION echo "%curr_dir%dir_size.txt" echo %%i >>"%curr_dir%dir_size.txt" type c:\vbs_result.txt |findstr .* >>"%curr_dir%dir_size.txt" endlocal ) else ( call "%curr_dir%calc_1.vbs" !z! %GB% type c:\vbs_result.txt echo %%i >>"%curr_dir%dir_size.txt" type c:\vbs_result.txt |findstr .* >>"%curr_dir%dir_size.txt" ) ) else ( rem if !z! GEQ %MB% ( if not exist "%curr_dir%calc_1.vbs" ( rem 處理父目錄存在驚嘆號的路徑,如果父目錄的路徑中存在驚嘆號,會被丟掉,因為開啟了變數延遲。 setlocal DISABLEDELAYEDEXPANSION echo parent folder not exist ....... because it contails !! copy "%curr_dir%calc_1.vbs" d:\ endlocal call "d:\calc_1.vbs" !z! %GB% setlocal DISABLEDELAYEDEXPANSION echo "%curr_dir%dir_size.txt" echo %%i >>"%curr_dir%dir_size.txt" type c:\vbs_result.txt |findstr .* >>"%curr_dir%dir_size.txt" endlocal ) else ( call "%curr_dir%calc_1.vbs" !z! %GB% type c:\vbs_result.txt echo %%i >>"%curr_dir%dir_size.txt" type c:\vbs_result.txt |findstr .* >>"%curr_dir%dir_size.txt" ) ) endlocal rem setlocal enabledelayedexpansion for /f "usebackq delims=" %%j in ("c:\vbs_result.txt") do ( echo. echo dir_total_size 000 == %%j set dir_total_size=%%j rem endlocal setlocal DISABLEDELAYEDEXPANSION echo dir_total_size 111 == "%%j" echo dir_total_size 222 == "%dir_total_size%" echo dir_total_size 333 == "!dir_total_size!" echo dir_total_size 444 == "%%i" echo dir_total_size 555 == "%%j%%i" echo dir_total_size --- == "%%j!%%i!" set avc=%%j%%i echo dir_total_size 666 == "%avc%" echo dir_total_size 777 == "!avc!" rename "%%i" "%%j%%i" endlocal ) echo. echo dir_total_size 002 == !dir_total_size! echo before_rename 0 ="%%i" echo afterr_rename 0 ="%dir_total_size%%%i" echo afterr_rename 0 ="!dir_total_size!%%i" echo afterr_rename 0 ="^!dir_total_size^!%%i" rem endlocal echo before_rename 1 ="%%i" echo afterr_rename 1 ="%dir_total_size%%%i" echo afterr_rename 1 ="!dir_total_size!%%i" echo afterr_rename 1 ="^!dir_total_size^!%%i" rem rename "%%i" "!dir_total_size!%%i" rem endlocal echo ------------------------------------------------------------------------------------------------------) pauserem echo === "%curr_dir%calc_1.vbs" ===setlocal DISABLEDELAYEDEXPANSIONdel /f /s /q "%curr_dir%calc_1.vbs" del /f /s /q "c:\vbs_result.txt"del /f /s /q "%curr_dir%directory.txt"endlocalpause