2016-05-12 94 views
0

我有一個包含超過100個子文件夾的父文件夾。我想要一個包含子文件夾及其大小的文本文件。你能幫我建立批處理程序嗎?文件夾列表及其大小

+1

什麼操作系統? – pfnuesel

+0

您能否展示迄今爲止的代碼? – marthursson

+0

你好,Windows7是操作系統。 –

回答

0

僅針對無大小的文件名,你可以使用此代碼 -

dir *.* /b /s >> C:\ListOfFile.txt 

更改您的「C:\」每當你想保存文件的路徑。

+0

謝謝先生。這給出像子文件夾1,子文件夾2,子文件夾3等輸出。我想構建該程序以獲取每個子文件夾的大小。 –

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 
::*********************************************************************** 
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環捕捉它的輸出,檢索最後一行之前的行並提取大小值。

以下純腳本 - 我們稱之爲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爲了避免與(子)directorie問題被切換在他們的名字中包含驚歎號(!)。

請注意,dir /S命令的輸出是依賴於語言的,因此該腳本可能無法在英語系統以外的系統上提供預期結果。在這種情況下,for /F循環的選項字符串"skip=10 tokens=3",特別是token選項需要相應地進行調整。

相關問題