計算當前檔案夾大小,並加到檔案夾的前面-添加首碼大小-成功處理帶驚嘆號的檔案名稱

來源:互聯網
上載者:User

寫此代碼的初衷: 本人是電影愛好者,有上千部電影在同一個目錄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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.