我有一个父文件夹,其中包含100多个子文件夹。我想要一个包含子文件夹及其大小的文本文件。你能帮我建一下批处理程序吗?
答案 0 :(得分:0)
仅对于没有大小的文件名,您可以使用此代码 -
dir *.* /b /s >> C:\ListOfFile.txt
将“C:\”路径更改为您想要保存文件的时间。
答案 1 :(得分:0)
这段代码可以解决问题:
@echo off
Title Get Size of Folder and its subfolders
set "Folder=C:\temp"
Set Log=Folder_Size.txt
(
echo The size of "%Folder%" is
Call :GetSize "%Folder%"
)> "%Log%"
For /f "delims=" %%a in ('Dir "%Folder%" /AD /b /s') do (
(
echo The size of "%%a" is
Call :GetSize "%%a"
)>> "%Log%"
)
start "" "%Log%"
::***********************************************************************
:GetSize
(
echo wscript.echo GetSize("%~1"^)
echo Function GetSize(MyFolder^)
echo Set fso = CreateObject("Scripting.FileSystemObject"^)
echo Set objFolder= fso.GetFolder(MyFolder^)
echo GetSize = FormatSize(objFolder.Size^)
echo End Function
echo '*******************************************************************
echo 'Function to format a number into typical size scales
echo Function FormatSize(iSize^)
echo aLabel = Array("bytes", "KB", "MB", "GB", "TB"^)
echo For i = 0 to 4
echo If iSize ^> 1024 Then
echo iSize = iSize / 1024
echo Else
echo Exit For
echo End If
echo Next
echo FormatSize = Round(iSize,2^) ^& " " ^& aLabel(i^)
echo End Function
echo '*******************************************************************
)>%tmp%\Size.vbs
Cscript /NoLogo %tmp%\Size.vbs
Del %tmp%\Size.vbs
Exit /b
::***********************************************************************
答案 2 :(得分:0)
虽然你没有表现出任何自己尝试的努力,但我决定帮助你,因为这项任务可能不是特别容易实现的......
您是否见过dir /S
的输出(列出指定目录及其所有子目录中文件的命令)?它总结了最后文件的总数,包括整体大小:
D:\TEMP>dir /S /-C Volume in drive D is DATA Volume Serial Number is XXXX-XXXX Directory of D:\TEMP 2016/05/12 12:00 <DIR> . 2016/05/12 12:00 <DIR> .. 0 File(s) 0 bytes Total Files Listed: 0 File(s) 0 bytes 2 Dir(s) ?????????? bytes free
因此,我们可以为给定位置的每个目录执行dir /S
命令,使用for /F
循环捕获其输出,检索最后一行之前的行并提取大小值。
以下纯batch-file脚本 - 我们称之为folder_sizes.bat
- 完成以下步骤:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Get provided arguments:
set "FOLDER=%~1"
set "LOG=%~2"
rem // Check provided arguments:
if not defined LOG set "LOG=con"
setlocal EnableDelayedExpansion
>&2 (
if not defined FOLDER (
echo(ERROR: no directory specified!
exit /B 1
) else if not exist "!FOLDER!\" (
rem /* (trailing "\" to check for directory) */
echo(ERROR: directory not found!
exit /B 1
)
)
rem // Process all sub-directories of given directory:
> "!LOG!" (
for /D %%D in ("!FOLDER!\*") do (
for /F "skip=10 tokens=3" %%F in ('
dir /S /-C "%%~fD"
') do (
set "BYTES=!VALUE!"
set "VALUE=%%F"
)
setlocal DisableDelayedExpansion
set "ITEM=%%~nxD"
setlocal EnableDelayedExpansion
rem // Return name and size of sub-directory:
echo(!ITEM! !BYTES!
endlocal
endlocal
)
)
endlocal
endlocal
exit /B
要在某个目录上运行此脚本 - 例如D:\TEMP
- 并将日志数据写入当前目录中的文件folder_sizes.log
,请使用以下命令行:
folder_sizes.bat "D:\TEMP" ".\folder_sizes.log"
在脚本中,切换delayed expansion以避免名称中包含exclamantion标记(!
)的(子)目录出现问题。
请注意,dir /S
命令的输出与语言有关,因此脚本可能无法在英语以外的系统上提供预期结果。在这种情况下,"skip=10 tokens=3"
循环的选项字符串for /F
,尤其是token
选项,需要相应调整。