Espace libre dans un shell CMD

95

Existe-t-il un moyen d'obtenir la quantité d'espace disque libre d'un disque ou d'un dossier dans un CMD sans avoir à installer des applications tierces?

J'ai un CMD qui copie un gros fichier dans un répertoire donné et pourrait bien sûr utiliser le retour de niveau d'erreur de la commande de copie, mais je dois attendre le temps qu'il faut pour copier le fichier (par exemple ... le disque est plein et l'opération de copie échoue).

Je voudrais savoir avant de commencer la copie si c'est une idée. J'ai essayé l'utilitaire DU.EXE de Sysinternals, mais cela montre uniquement l'espace occupé.

Ned Batchelder
la source
Je dois supposer que «l'installation par un tiers» signifie plutôt «toute installation de logiciel supplémentaire». que l'aspect pratique de ne pas avoir besoin de fournir ni d'installer quoi que ce soit. seulement à bord des moyens.
Alexander Stohr

Réponses:

112

Si vous exécutez " dir c:\", la dernière ligne vous donnera l'espace disque libre.

Edit: Meilleure solution: " fsutil volume diskfree c:"

Nico
la source
1
Et cela fonctionne également avec les points de montage, ce qui n'est pas le cas avec dir!
LogicDaemon
2
Dir fonctionne bien, mais notez que vous devrez créer un fichier factice si votre lecteur est vide. Sinon, cela ne donne pas d'espace libre au lecteur (<3 Ms :)
Balmipour
y a-t-il un moyen d'obtenir juste le nombre d'octets libres?
Mina Jacob
De plus, à l'exception du répertoire racine, dir ..*(ou dir c:\thing\..*) affichera une liste très courte, qu'il y ait ou non zéro ou plusieurs fichiers dans le répertoire.
azhrei
La méthode fsutil peut ne pas fonctionner pour les lecteurs virtuels tels que le lecteur RAM IMDisk. Vous allez obtenir: Erreur: fonction incorrecte. L'utilitaire FSUTIL nécessite un volume NTFS local.
user2846246
51

Une solution possible:

dir|find "bytes free"

une solution plus " avancée ", pour Windows Xp et au-delà:

wmic /node:"%COMPUTERNAME%" LogicalDisk Where DriveType="3" Get DeviceID,FreeSpace|find /I "c:"

L' outil de ligne de commande Windows Management Instrumentation (WMIC) (Wmic.exe) peut collecter de grandes quantités d'informations sur Windows Server 2003 ainsi que sur Windows XP ou Vista. L'outil accède au matériel sous-jacent à l'aide de Windows Management Instrumentation (WMI). Pas pour Windows 2000.


Comme l'a noté Alexander Stohr dans les commentaires :

  • WMIC peut également voir les restrictions basées sur des stratégies. (même si ' dir' fera toujours le travail),
  • ' dir' dépend des paramètres régionaux.
VonC
la source
5
+1 pour WMI. Devrait être la seule solution stable. S'appuyer sur une langue spécifique (pour trouver) est probablement une mauvaise idée :)
Joey
Pour mettre l'espace libre dans une variable, on pourrait utiliser ce qui suit:@FOR /F "tokens=2 delims==" %%S IN ('wmic /NODE:"%COMPUTERNAME%" LogicalDisk Where ^(DriveType^="3" and DeviceID^="%some_folder:~0,2%"^) Get FreeSpace /VALUE') DO @SET freespace=%%S
Davor Josipovic
3
@Pacerier: Je pense que je me souviens fsutilavoir besoin de privilèges d'administrateur pour même fonctionner, peu importe ce que vous en faites.
Joey
1
@AlexanderStohr Bons points. J'ai inclus votre commentaire dans la réponse pour plus de visibilité.
VonC
8

En utilisant cette commande, vous pouvez trouver toutes les partitions, la taille et l'espace libre: wmic logicaldisk get size, freespace, caption

Dewsri De Mel
la source
7

Vous pouvez éviter les virgules en utilisant / -C sur la commande DIR.

FOR /F "usebackq tokens=3" %%s IN (`DIR C:\ /-C /-O /W`) DO (
    SET FREE_SPACE=%%s
)
ECHO FREE_SPACE is %FREE_SPACE%

Si vous souhaitez comparer l'espace disponible à l'espace nécessaire, vous pouvez faire quelque chose comme ce qui suit. J'ai spécifié le nombre avec un séparateur de milliers, puis je les ai supprimés. Il est difficile de saisir le nombre sans virgule. Le SET / A est sympa, mais il cesse de fonctionner avec de grands nombres.

SET EXITCODE=0
SET NEEDED=100,000,000
SET NEEDED=%NEEDED:,=%

IF %FREE_SPACE% LSS %NEEDED% (
    ECHO Not enough.
    SET EXITCODE=1
)
EXIT /B %EXITCODE%
allumé
la source
6

Le script suivant vous donnera des octets libres sur le lecteur:

@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=3" %%a in ('dir c:\') do (
    set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
echo %bytesfree%
endlocal && set bytesfree=%bytesfree%

Notez que cela dépend de la sortie de votre dircommande, qui nécessite la dernière ligne contenant l'espace libre du format 24 Dir(s) 34,071,691,264 bytes free. Plus précisément:

  • il doit s'agir de la dernière ligne (ou vous pouvez modifier la forboucle pour détecter la ligne explicitement plutôt que de vous fier au réglage bytesfreepour chaque ligne).
  • l'espace libre doit être le troisième "mot" (ou vous pouvez changer le tokens=bit pour obtenir un mot différent).
  • les séparateurs de milliers sont le ,caractère (ou vous pouvez changer la substitution de la virgule à autre chose).

Il ne pollue pas votre espace de noms d'environnement, ne définissant que la bytesfreevariable à la sortie. Si votre dirsortie est différente (par exemple, des paramètres régionaux ou de langue différents), vous devrez ajuster le script.

paxdiablo
la source
6

df.exe

Affiche tous vos disques; capacité totale, utilisée et libre. Vous pouvez modifier la sortie par diverses options de ligne de commande.

Vous pouvez l'obtenir sur http://www.paulsadowski.com/WSH/cmdprogs.htm , http://unxutils.sourceforge.net/ ou ailleurs. C'est un utilitaire unix standard comme du.

df -haffichera tout l'espace disque utilisé et disponible de votre lecteur. Par exemple:

M:\>df -h
Filesystem      Size  Used Avail Use% Mounted on
C:/cygwin/bin   932G   78G  855G   9% /usr/bin
C:/cygwin/lib   932G   78G  855G   9% /usr/lib
C:/cygwin       932G   78G  855G   9% /
C:              932G   78G  855G   9% /cygdrive/c
E:              1.9T  1.3T  621G  67% /cygdrive/e
F:              1.9T  201G  1.7T  11% /cygdrive/f
H:              1.5T  524G  938G  36% /cygdrive/h
M:              1.5T  524G  938G  36% /cygdrive/m
P:               98G   67G   31G  69% /cygdrive/p
R:               98G   14G   84G  15% /cygdrive/r

Cygwin est disponible gratuitement sur: https://www.cygwin.com/ Il ajoute de nombreux outils puissants à l'invite de commande. Pour obtenir uniquement l'espace disponible sur le lecteur M (tel qu'il est mappé dans Windows sur un lecteur partagé), on peut entrer:

M:\>df -h | grep M: | awk '{print $4}'
tommym
la source
2
savez-vous pourquoi vous avez été minused? Parce que vous ne lisez pas la question attentivement. Lire: «sans avoir à installer des applications tierces». Bien que j'aime personnellement les unxutils, ce n'est pas la réponse ici.
LogicDaemon
7
C'est toujours une réponse de qualité décente pour ceux qui viennent ici en dehors de l'OP
Peter
1

En utilisant l' excellente solution paxdiablo , j'ai écrit un script batch un peu plus sophistiqué, qui utilise la lettre de lecteur comme argument entrant et vérifie si le lecteur existe de manière délicate (mais pas esthétique):

@echo off
setlocal enableextensions enabledelayedexpansion
set chkfile=drivechk.tmp
if "%1" == "" goto :usage
set drive=%1
set drive=%drive:\=%
set drive=%drive::=%
dir %drive%:>nul 2>%chkfile%
for %%? in (%chkfile%) do (
  set chksize=%%~z?
)
if %chksize% neq 0 (
  more %chkfile%
  del %chkfile%
  goto :eof
)
del %chkfile%
for /f "tokens=3" %%a in ('dir %drive%:\') do (
  set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
echo %bytesfree% byte(s) free on volume %drive%:
endlocal

goto :eof
:usage
  echo.
  echo   usage: freedisk ^<driveletter^> (eg.: freedisk c)

note1: vous pouvez taper une lettre simple (par exemple, x) ou utiliser x: ou x: \ format comme lettre de lecteur dans l'argument

note2: le script affichera stderr de% chkfile% uniquement si la taille est supérieure à 0

note3: j'ai enregistré ce script sous le nom Freedisk.cmd (voir utilisation)

Zsolt Hidasi
la source
1

Je fais une variation pour générer ceci à partir du script:

volume C: - 49 GB total space / 29512314880 byte(s) free

J'utilise diskpart pour obtenir ces informations.

@echo off
setlocal enableextensions enabledelayedexpansion
set chkfile=drivechk.tmp
if "%1" == "" goto :usage
set drive=%1
set drive=%drive:\=%
set drive=%drive::=%
dir %drive%:>nul 2>%chkfile%
for %%? in (%chkfile%) do (
  set chksize=%%~z?
)
if %chksize% neq 0 (
  more %chkfile%
  del %chkfile%
  goto :eof
)
del %chkfile%
echo list volume | diskpart | find /I " %drive% " >%chkfile%
for /f "tokens=6" %%a in ('type %chkfile%' ) do (
    set dsksz=%%a
)
for /f "tokens=7" %%a in ('type %chkfile%' ) do (
    set dskunit=%%a
)
del %chkfile%
for /f "tokens=3" %%a in ('dir %drive%:\') do (
  set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
echo volume %drive%: - %dsksz% %dskunit% total space / %bytesfree% byte(s) free
endlocal

goto :eof
:usage
  echo.
  echo   usage: freedisk ^<driveletter^> (eg.: freedisk c)
Pedro Robson Leão
la source
0

Est-ce que cscript est une application tierce? Je suggère d'essayer Microsoft Scripting , où vous pouvez utiliser un langage de programmation (JScript, VBS) pour vérifier des éléments tels que List Available Disk Space .

L'infrastructure de script est présente sur toutes les versions actuelles de Windows (y compris 2008).

gimel
la source
1
cscript est Microsoft Scripting. Il s'agit de la version console de l'interpréteur de scripts Windows ( wscriptc'est la version GUI).
Synetech
Je dois supposer que «l'installation par un tiers» signifie plutôt «toute installation de logiciel supplémentaire». que l'aspect pratique de ne pas avoir besoin de fournir ni d'installer quoi que ce soit. seulement à bord des moyens.
Alexander Stohr