Je veux une solution simple pour la liste des dossiers et leur taille au format txt ou csv.
J'utilise ce code pour la liste des dossiers
dir C:\Temp\*.* /b /a:d > C:\folderList.txt
sortie actuelle
<<folderList.txt>>
folder1
folder2
folder3
sortie désirée
<<folderList.txt>>
folder1 # 100 MB
folder2 # 30 MB
folder3 # 110 MB
Cela générerait simplement la taille de chaque dossier ... Comment puis-je procéder? de l'aide
Pour chaque dossier de la liste, utilisez la commande dir
pour récupérer la taille des fichiers du dossier.
@echo off
setlocal disabledelayedexpansion
set "folder=%~1"
if not defined folder set "folder=%cd%"
for /d %%a in ("%folder%\*") do (
set "size=0"
for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:" "') do if "%%~c"=="" set "size=%%~b"
setlocal enabledelayedexpansion
echo(%%~nxa # !size!
endlocal
)
endlocal
Il effectue une itération sur le dossier indiqué (transmis en tant que paramètre au fichier de commandes ou au répertoire en cours s'il n'y a pas de paramètre).
(for /d
) une commande récursive dir
est exécutée dans la commande inner for
et, à partir de sa sortie, la ligne de résumé à la fin (extraite par findstr
) est analysée (la commande tokens
dans for
) et la taille totale de tous les fichiers de ce sous-dossier sont récupérés. Ensuite, le nom (et l’extension si c’est le cas) du dossier et la taille des éléments qu’il contient sont renvoyés à la console.
Si un fichier doit être créé, redirigez la sortie du lot vers un fichier.
getSizes.cmd "c:\temp" > C:\folderList.txt
En utilisant l'excellent code de MC ND, j'ai ajouté la conversion en Kb, Mb, Gb, etc.
@echo off
setlocal disabledelayedexpansion
set "folder=%~1"
if not defined folder set "folder=%cd%"
for /d %%a in ("%folder%\*") do (
set "size=0"
for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:" "') do if "%%~c"=="" set "size=%%~b"
setlocal enabledelayedexpansion
call :GetUnit !size! unit
call :ConvertBytes !size! !unit! newsize
echo(%%~nxa - !newsize! !unit!
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
si vous utilisez Windows 7 ou une nouvelle utilisation, PowerShell et tapez la commande
ls- r >> log.txt
il listera tous les fichiers du répertoire courant avec la taille en octets du fichier journal
Mon JREN.BAT utility peut être utilisé pour obtenir une liste de dossiers avec des tailles. Il s'agit d'un script hybride JScript/batch qui s'exécute de manière native sur toute machine Windows à partir de XP.
JREN ne convertit pas facilement en Mo (ou toute autre unité) - il indique simplement la taille en octets. Mais c’est bien pratique (et relativement rapide) d’obtenir la liste:
jren "$" "' # '+size()" /d /j /list /p "d:\temp" >"C:\folderList.txt"
Vous pouvez envisager de placer la taille du dossier en premier, l'espace inséré dans une largeur fixe dépassant le plus grand dossier, suivi du nom du dossier. Je trouve ce format beaucoup plus facile à lire, et il est toujours facile d'analyser:
jren "^" "size(' ')+' '" /d /j /list /p "d:\temp" >"C:\folderList.txt"
La sortie ressemblerait à quelque chose comme ça
1852 SomeFolderName
1616869 Another folder name
137764 yetAnother
JREN étant un fichier de commandes, vous devez utiliser CALL JREN si vous placez la commande dans un autre script de traitement par lots.
try sed pour Windows:
dir /-c /a /w /s|sed -nr "/:$/q;/:/h;/^\s+[0-9]/{s/.*[^0-9]([0-9]+.*)/\1/;H;g;s/\n/ /p}"
J'ai pris le code @Matt Williamsons et l'ai fait exporter chaque ligne dans un fichier .csv du répertoire d'exécution, folderSizes.csv. Il fournit la taille en octets complète sous forme de colonne afin que vous puissiez facilement trier dans Excel (ou autre).
@echo off
echo Getting folder sizes for you...storing to folderSizes.csv
setlocal disabledelayedexpansion
if EXIST folderSizes.csv del folderSizes.csv
echo Folder,Bytes Size,Short Size > folderSizes.csv
set "folder=%~1"
if not defined folder set "folder=%cd%"
for /d %%a in ("%folder%\*") do (
set "size=0"
for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:" "') do if "%%~c"=="" set "size=%%~b"
setlocal enabledelayedexpansion
call :GetUnit !size! unit
call :ConvertBytes !size! !unit! newsize
echo(%%~nxa,!size!,!newsize!!unit! >> folderSizes.csv
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