web-dev-qa-db-fra.com

Obtenir la taille du dossier à partir de la ligne de commande Windows

Est-il possible sous Windows d’obtenir la taille d’un dossier à partir de la ligne de commande sans utiliser d’outil tiers?

Je veux le même résultat que lorsque vous cliquez avec le bouton droit de la souris sur le dossier dans l'explorateur Windows → Propriétés.

98
Eldad AK

Vous pouvez simplement ajouter des tailles récursivement (le fichier ci-dessous est un fichier de commandes):

@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes

Cependant, cela pose plusieurs problèmes car cmd est limité à l'arithmétique des entiers signés 32 bits. Donc, il aura des tailles supérieures à 2 GiB faux1. De plus, il comptera probablement plusieurs fois des liens symboliques et des jonctions. Il s’agit au mieux d’une limite supérieure et non de sa taille réelle (vous aurez ce problème avec n’importe quel outil).

Une alternative est PowerShell:

Get-ChildItem -Recurse | Measure-Object -Sum Length

ou plus court:

ls -r | measure -s Length

Si vous le voulez plus joli:

switch((ls -r|measure -s Length).Sum) {
  {$_ -gt 1GB} {
    '{0:0.0} GiB' -f ($_/1GB)
    break
  }
  {$_ -gt 1MB} {
    '{0:0.0} MiB' -f ($_/1MB)
    break
  }
  {$_ -gt 1KB} {
    '{0:0.0} KiB' -f ($_/1KB)
    break
  }
  default { "$_ bytes" }
}

Vous pouvez utiliser ceci directement à partir de cmd:

powershell -noprofile -command "ls -r|measure -s Length"

1 J'ai une bibliothèque bignum partiellement finie dans des fichiers batch quelque part qui obtient au moins une addition complète de précision arbitraire. Je devrais vraiment le publier, je suppose :-)

93
Joey

Il existe un outil Windows intégré pour cela:

dir /s 'FolderName'

Cela imprimera beaucoup d’informations inutiles, mais la taille du dossier sera la suivante:

 Total Files Listed:
       12468 File(s)    182,236,556 bytes

Si vous devez inclure des dossiers cachés, ajoutez /a.

89
Andro Secy

Je suggère de télécharger l'utilitaire DU de la suite Sysinternals fourni par Microsoft à ce lien http://technet.Microsoft.com/en-us/sysinternals/bb896651

usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory>
   -c     Print output as CSV.
   -l     Specify subdirectory depth of information (default is all levels).
   -n     Do not recurse.
   -q     Quiet (no banner).
   -u     Count each instance of a hardlinked file.
   -v     Show size (in KB) of intermediate directories.


C:\SysInternals>du -n d:\temp

Du v1.4 - report directory disk usage
Copyright (C) 2005-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

Files:        26
Directories:  14
Size:         28.873.005 bytes
Size on disk: 29.024.256 bytes

Pendant que vous y êtes, jetez un coup d'œil aux autres utilitaires. Ils sont une bouée de sauvetage pour chaque Windows Professional

59
Steve

Bon mot:

powershell -command "$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName"

Idem mais Powershell uniquement:

$fso = new-object -com Scripting.FileSystemObject
gci -Directory `
  | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName `
  | sort Size -Descending `
  | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName

Cela devrait produire le résultat suivant:

Size [MB]  FullName
---------  --------
580,08     C:\my\Tools\mongo
434,65     C:\my\Tools\Cmder
421,64     C:\my\Tools\mingw64
247,10     C:\my\Tools\dotnet-rc4
218,12     C:\my\Tools\ResharperCLT
200,44     C:\my\Tools\git
156,07     C:\my\Tools\dotnet
140,67     C:\my\Tools\vscode
97,33      C:\my\Tools\Apache-jmeter-3.1
54,39      C:\my\Tools\mongoadmin
47,89      C:\my\Tools\Python27
35,22      C:\my\Tools\robomongo
21
frizik

Si vous avez installé git sur votre ordinateur (de plus en plus courant), ouvrez simplement MINGW32 et tapez: du folder

9
Custodio

Je recommande d'utiliser https://github.com/aleksaan/diskusage utility. Très simple et utile. Et très vite.

Il suffit de taper une commande Shell

diskusage.exe -path 'd:/go; d:/Books'

et obtenir la liste des dossiers classés par taille

 1. | DIR: d:/go | TAILLE: 325.72 Mo | PROFONDEUR: 1 
 2. | DIR: d:/Livres | TAILLE: 14,01 Mo | PROFONDEUR: 1 

Cet exemple a été exécuté à 272ms sur le disque dur.

Vous pouvez augmenter la profondeur des sous-dossiers à analyser, par exemple:

diskusage.exe -path 'd:/go; d:/Books' -depth 2

et obtenez des tailles non seulement pour les dossiers sélectionnés mais également pour ses sous-dossiers

 1. | DIR: d:/go | TAILLE: 325.72 Mo | PROFONDEUR: 1 
 2. | DIR: d:/go/pkg | TAILLE: 212,88 Mo | PROFONDEUR: 2 
 3. | DIR: d:/go/src | TAILLE: 62,57 Mo | PROFONDEUR: 2 
 4. | DIR: d:/go/bin | TAILLE: 30,44 Mo | PROFONDEUR: 2 
 5. | DIR: d:/Livres/Echecs | TAILLE: 14,01 Mo | PROFONDEUR: 2 
 6. | DIR: d:/Livres | TAILLE: 14,01 Mo | PROFONDEUR: 1 
 7. | DIR: d:/go/api | TAILLE: 6.41 Mo | PROFONDEUR: 2 
 8. | DIR: d:/go/test | TAILLE: 5.11 Mo | PROFONDEUR: 2 
 9. | DIR: d:/go/doc | TAILLE: 4.00 Mo | PROFONDEUR: 2 
 10. | DIR: d:/go/misc | TAILLE: 3.82 Mo | PROFONDEUR: 2 
 11. | DIR: d:/go/lib | TAILLE: 358.25 Kb | PROFONDEUR: 2 

* 3,5 To sur le serveur ont été analysés pendant 3m12s

6
Alexander Anufriev

Voici un code powershell que j’écris pour répertorier la taille et le nombre de fichiers de tous les dossiers du répertoire en cours. N'hésitez pas à réutiliser ou à modifier selon vos besoins.

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    set-location $folder.FullName
    $size = Get-ChildItem -Recurse | Measure-Object -Sum Length
    $info = $folder.FullName + "    FileCount: " + $size.Count.ToString() + "   Size: " + [math]::Round(($size.Sum / 1GB),4).ToString() + " GB"
    write-Host $info
}
3
Ryan Lee

J'imagine que cela ne fonctionnerait que si le répertoire est assez statique et que son contenu ne change pas entre l'exécution des deux commandes dir. Peut-être un moyen de combiner cela dans une seule commande pour éviter cela, mais cela a fonctionné pour mon but (je ne voulais pas la liste complète; juste le résumé).

Script GetDirSummary.bat:

@echo off
rem  get total number of lines from dir output
FOR /F "delims=" %%i IN ('dir /S %1 ^| find "asdfasdfasdf" /C /V') DO set lineCount=%%i
rem  dir summary is always last 3 lines; calculate starting line of summary info
set /a summaryStart="lineCount-3"
rem  now output just the last 3 lines
dir /S %1 | more +%summaryStart%

Usage:

GetDirSummary.bat c:\temp

Sortie:

 Total Files Listed:
          22 File(s)         63,600 bytes
           8 Dir(s)  104,350,330,880 bytes free
2
Steve

Ce code est testé. Vous pouvez le vérifier à nouveau.

@ECHO OFF
CLS
SETLOCAL
::Get a number of lines contain "File(s)" to a mytmp file in TEMP location.
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /C "File(s)" >%TEMP%\mytmp
SET /P nline=<%TEMP%\mytmp
SET nline=[%nline%]
::-------------------------------------
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1
SET /P mainline=<%TEMP%\mytmp1
CALL SET size=%mainline:~29,15%
ECHO %size%
ENDLOCAL
PAUSE
2
Chienvela

Le script suivant peut être utilisé pour extraire et accumuler la taille de chaque fichier dans un dossier donné.
Le chemin du dossier %folder% peut être donné comme argument de ce script (%1).
En fin de compte, les résultats sont conservés dans le paramètre %filesize%

@echo off
SET count=1
SET foldersize=0
FOR /f "tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize "%%F")
echo %filesize%
GOTO :eof

:calcAccSize
 REM echo %count%:%1
 REM set /a count+=1
 set /a foldersize+=%~z1
 GOTO :eof

Remarque: La méthode calcAccSize peut également imprimer le contenu du dossier (commenté dans l'exemple ci-dessus).

1
Lior Kirshner

J'ai eu du.exe avec ma distribution git. Microsoft ou Unxutils .

Une fois que vous avez du.exe dans votre chemin. Voici votre fileSizes.bat :-)

@echo ___________
@echo DIRECTORIES
@for /D %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo FILES
@for %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo TOTAL
@du.exe -sh "%CD%"

___________
DIRECTORIES
37M     Alps-images
12M     testfolder
_____
FILES
765K    Dobbiaco.jpg
1.0K    testfile.txt
_____
TOTAL
58M    D:\pictures\sample
1
Frank Nocke

Essayer:

SET FOLDERSIZE=0
FOR /F "tokens=3" %A IN ('DIR "C:\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%A

Remplacez C:\Program Files par le dossier de votre choix et changez% A en %% A si vous utilisez un fichier de commandes.

Il renvoie la taille de l'ensemble du dossier, y compris les sous-dossiers et les fichiers cachés et système, et fonctionne avec des dossiers de plus de 2 Go.

Il écrit à l'écran, vous devrez donc utiliser un fichier intermédiaire si vous ne le souhaitez pas.

1
FrinkTheBrave

Voici donc une solution pour vos deux demandes de la manière que vous aviez initialement demandée. Cela donnera une lisibilité humaine à la taille du fichier sans les limites que tout le monde rencontre. Compatible avec Win Vista ou plus récent. XP disponible uniquement si Robocopy est installé. Déposez simplement un dossier sur ce fichier de commandes ou utilisez la meilleure méthode mentionnée ci-dessous.

@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"

For %%i in (%*) do (
    set "vSearch=Files :"
    For /l %%M in (1,1,2) do ( 
        for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
            if /i "%%M"=="1" (
                set "filecount=%%A"
                set "vSearch=Bytes :"
            ) else (
                set "foldersize=%%A%%B"
            )
        )
    )
    echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>FolderFileCountandSize.txt
    REM remove REM from command below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

Pour pouvoir utiliser ce fichier de commandes, placez-le facilement dans votre dossier SendTo. Cela vous permettra de cliquer avec le bouton droit de la souris sur un dossier ou sur une sélection de dossiers, de cliquer sur l'option Envoyer vers, puis de sélectionner ce fichier de commandes.

Pour trouver le dossier SendTo sur votre ordinateur, le plus simple consiste à ouvrir cmd puis à le copier tel quel dans cette ligne.

Explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo

1
julesverne

Je pense que votre seule option sera diruse (une solution tierce hautement prise en charge):

Obtenir la taille du fichier/répertoire à partir de la ligne de commande

La CLI de Windows est malheureusement assez restrictive, vous pouvez aussi installer Cygwin , ce qui est un rêve à utiliser par rapport à cmd. Cela vous donnerait accès à l’outil du port Unix qui est la base de diruse sur Windows.

Désolé, je n'ai pas pu répondre directement à vos questions avec une commande que vous pouvez exécuter sur le cli natif.

1
Illizian

J'ai résolu le même problème. Certaines des méthodes présentées dans cette page sont lentes et d'autres sont problématiques dans un environnement multilingue (toutes supposées en anglais) ... J'ai trouvé une solution de contournement simple en utilisant vbscript dans cmd. Il est testé dans W2012R2 et W7.

>%TEMP%\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (SET "S_=%%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

Il définit la variable d'environnement S_. Vous pouvez bien entendu modifier la dernière ligne pour afficher directement le résultat, par exemple.

FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

Vous pouvez l'utiliser en tant que sous-programme ou en tant que cmd autonome. Le paramètre est le nom du dossier testé fermé entre guillemets.

0
arpi