我没有写下面的大部分代码。事实上,我刚刚从下面的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"
我理解在循环中要处理的第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 :(得分:0)
强制延迟扩展!
会成为正在解析的文本中的毒药角色。
通过在某些点之前和之后禁用然后重新启用它来解决方法,但您可能会发现其他解决方案不依赖它。