web-dev-qa-db-fra.com

Comment lister tous les dossiers avec la taille via un fichier batch

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

10
goldenbutter

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
17
MC ND

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
11
Matt Williamson

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 

1
Ketan Verma

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.

1
dbenham

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}"
0
Endoro

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
0
Leland