【问题标题】:How to list all folder and sub folders with size via batch file如何通过批处理文件列出所有文件夹和子文件夹的大小
【发布时间】:2014-05-18 17:54:14
【问题描述】:

以下大部分代码我都没有写。事实上,我只是从下面的 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 "tokens=3,5"

我了解在循环中要处理的第 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

任何指针将不胜感激!

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    随着延迟扩展的生效,! 在被解析的文本中变成了毒字符。

    有一些变通方法是在某些点之前和之后禁用然后重新启用它,但您可能会找到其他不依赖它的解决方案。

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多