Batch file 如何通过批处理文件列出具有大小的所有文件夹和子文件夹

Batch file 如何通过批处理文件列出具有大小的所有文件夹和子文件夹,batch-file,Batch File,我没有编写以下大部分代码。事实上,我只是根据下面的堆栈后溢出答案对其进行了一些修改,非常令人印象深刻 问题是当文件名包含符号(例如!)而不是字母/数字时 其思想是让代码输出当前目录文件夹的名称和大小,然后是子文件夹 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“

我没有编写以下大部分代码。事实上,我只是根据下面的堆栈后溢出答案对其进行了一些修改,非常令人印象深刻

问题是当文件名包含符号(例如
)而不是字母/数字时

其思想是让代码输出当前目录文件夹的名称和大小,然后是子文件夹

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”

我理解,第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
@回音
echo(“>Current.txt
setlocal disabledelayedexpansion
设置“文件夹=%~1”
如果未定义文件夹集“文件夹=%cd%”
对于(“%folder%\*”)中的/d%%a,请执行以下操作(
设置“size1=0”
对于('dir/-c/a/w/s“%~fa\*”2^>num^ | findstr/b/c:”)中的/f“令牌=3,5”%%b,如果“%%~c”=”设置“大小1=%%~b”,则执行该操作
延迟扩展
呼叫:GetUnit!size1!unit1
调用:ConvertBytes!size1!!unit1!newsize1
对于(“%folder%\%%~nxa\*”中的/d%%h,请执行以下操作(
延迟扩展
对于('dir/-c/a/w/s“%~fh\*”2^>num^ | findstr/b/c:”)中的/f“令牌=3,5”%%b,如果“%%~c”=”设置“大小2=%%~b”,则执行该操作
延迟扩展
呼叫:GetUnit!size2!unit2
调用:ConvertBytes!size2!!unit2!newsize2
set/p VAR1=>List.txt
回声(%%~nxa-!newsize1!!单位1!
)
echo(%%~nsh-!newsize2!!unit2!>>List.txt
回声(%%~nsh-!newsize2!!单元2!
echo(%~nxa>Current.txt
端部
)
端部
)
端部
退出/b
:ConvertBytes字节单位ret
setlocal
如果“%~2”等于“KB”设置值=/1024
如果“%~2”等于“MB”设置值=/1024/1024
如果“%~2”等于“GB”设置值=/1024/1024/1024
如果“%~2”等于“TB”设置值=/1024/1024/1024
>%temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),1)
对于/f“delims=”%%a in(
'cscript//nologo%temp%\tmp.vbs'
)do endlocal&set%~3=%%a
删除%temp%\tmp.vbs
退出/b
:GetUnit bytes返回
设置byt=00000000000%1X
设置TB=00000000000109951162776X
如果%1 LEQ 1024设置为“单位=字节”
如果%1 GTR 1024设置为“单位=KB”
如果%1全球技术法规1048576设置“单位=MB”
如果%1全球技术法规1073741824设置为“单位=GB”
如果%byt:~-14%GTR%TB:~-14%设置为“单位=TB”
endlocal和set%~2=%unit%
退出/b

非常感谢任何指针!

延迟扩展生效
将成为解析文本中的有毒字符

在某些点之前和之后,可以通过禁用然后重新启用它来解决问题,但您可能会找到其他不依赖它的解决方案