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.
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 :-)
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
.
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
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
Si vous avez installé git sur votre ordinateur (de plus en plus courant), ouvrez simplement MINGW32 et tapez: du folder
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
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
}
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
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
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).
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
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.
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
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.
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.