2014-05-18 94 views
0

我沒有編寫大部分以下代碼。實際上,我只是從下面的帖子Stack Overflow的答案中修改了一下,非常令人印象深刻的東西。如何使用批處理文件列出具有大小的所有文件夾和子文件夾

https://stackoverflow.com/a/21727860/2579968

問題是,當一個文件名包含符號(例如!),而不是一個字母/數字。

這個想法是代碼輸出當前目錄文件夾的名稱和大小,其次是子文件夾。

Folder 1 - 151.3 MB 
    SubFolder 1 - 151.3 MB 
Folder 2 - 10.3 MB 
    SubFolder 1 - 5.3 MB 
    SubFolder 2 - 5.0 MB 

我有一種感覺,這是令人討厭的,但代碼導致的問題。

/F「令牌= 3,5」

據我所知,與環中要處理的第三和第五項。所以也許當它看到!時,它認爲它是另一個項目。

;@echo off 

echo("" >Current.txt 

    setlocal disabledelayedexpansion 

    set "folder=%~1" 

    if not defined folder set "folder=%cd%" 

    for /d %%a in ("%folder%\*") do (
     set "size1=0" 
     for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:" "') do if "%%~c"=="" set "size1=%%~b" 
     setlocal enabledelayedexpansion 
     call :GetUnit !size1! unit1 
     call :ConvertBytes !size1! !unit1! newsize1 

     for /d %%h in ("%folder%\%%~nxa\*") do (

      setlocal enabledelayedexpansion 
      for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fh\*" 2^>nul ^| findstr /b /c:" "') do if "%%~c"=="" set "size2=%%~b" 
       setlocal enabledelayedexpansion 
       call :GetUnit !size2! unit2 
       call :ConvertBytes !size2! !unit2! newsize2 

       set /p VAR1=<Current.txt 

       if not !VAR1! EQU %%~nxa (
        echo(%%~nxa - !newsize1! !unit1! >>List.txt 
        echo(%%~nxa - !newsize1! !unit1! 

       ) 

       echo( %%~nxh - !newsize2! !unit2! >>List.txt 
       echo( %%~nxh - !newsize2! !unit2! 
       echo(%%~nxa>Current.txt 

       endlocal 
      ) 

    endlocal 
) 

endlocal 
exit /b 

:ConvertBytes bytes unit ret 
setlocal 
if "%~2" EQU "KB" set val=/1024 
if "%~2" EQU "MB" set val=/1024/1024 
if "%~2" EQU "GB" set val=/1024/1024/1024 
if "%~2" EQU "TB" set val=/1024/1024/1024/1024 
> %temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),1) 
for /f "delims=" %%a in (
    'cscript //nologo %temp%\tmp.vbs' 
) do endlocal & set %~3=%%a 
del %temp%\tmp.vbs 
exit /b 


:GetUnit bytes return 
set byt=00000000000%1X 
set TB=000000000001099511627776X 
if %1 LEQ 1024 set "unit=Bytes" 
if %1 GTR 1024 set "unit=KB" 
if %1 GTR 1048576 set "unit=MB" 
if %1 GTR 1073741824 set "unit=GB" 
if %byt:~-14% GTR %TB:~-14% set "unit=TB" 
endlocal & set %~2=%unit% 
exit /b 

任何指針將不勝感激!

回答

0

隨着延遲擴展!成爲正在分析的文本中的毒性字符。

有一些解決方法是禁用並在某些點之前和之後重新啓用它,但是您可能會發現其他解決方案不依賴於它。

相關問題