Espacio libre en un shell CMD

95

¿Hay alguna forma de obtener la cantidad de espacio libre en disco de un disco o una carpeta en un CMD sin tener que instalar algunas aplicaciones de terceros?

Tengo un CMD que copia un archivo grande en un directorio determinado y, por supuesto, podría usar el retorno de nivel de error del comando de copia, pero luego tengo que esperar el tiempo que se tarda en copiar el archivo (por ejemplo, a ese entonces el el disco está lleno y la operación de copia falla).

Me gustaría saber antes de comenzar la copia si hay alguna idea. Probé la utilidad DU.EXE de Sysinternals, pero solo muestra el espacio ocupado.

Ned Batchelder
fuente
Debo asumir que "instalación de terceros" significa "cualquier instalación de software adicional". que el aspecto práctico de no tener que proporcionar ni instalar nada. solo medios a bordo.
Alexander Stohr

Respuestas:

112

Si ejecuta " dir c:\", la última línea le dará espacio libre en el disco.

Editar: Mejor solución: " fsutil volume diskfree c:"

Nico
fuente
1
¡Y también funciona con puntos de montaje, que no es el caso de dir!
LogicDaemon
2
Dir funciona bien, pero tenga en cuenta que tendrá que crear un archivo ficticio si su unidad está vacía. De lo contrario, no le da espacio libre a la unidad (<3 Ms :)
Balmipour
¿Hay alguna forma de obtener solo el número de bytes libres?
Mina Jacob
Además, a excepción del directorio raíz, dir ..*(o dir c:\thing\..*) mostrará una lista muy corta, ya sea que haya o no cero o muchos archivos en el directorio.
azhrei
Es posible que la forma fsutil no funcione para unidades virtuales como IMDisk RAM Drive. Obtendrá: Error: Función incorrecta. La utilidad FSUTIL requiere un volumen NTFS local.
user2846246
51

Una posible solución:

dir|find "bytes free"

una " solución más avanzada ", para Windows Xp y más allá:

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

La herramienta de línea de comandos de Instrumental de administración de Windows (WMIC) (Wmic.exe) puede recopilar una gran cantidad de información sobre Windows Server 2003, así como Windows XP o Vista. La herramienta accede al hardware subyacente mediante Windows Management Instrumentation (WMI). No para Windows 2000.


Como señaló Alexander Stohr en los comentarios :

  • WMIC también puede ver restricciones basadas en políticas. (incluso si ' dir' seguirá haciendo el trabajo),
  • ' dir' depende de la configuración regional.
VonC
fuente
5
+1 para WMI. Debería ser la única solución estable. Depender de un idioma específico (para buscar) es probablemente una mala idea :)
Joey
Para poner el espacio libre en una variable, se podría usar lo siguiente:@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: Creo que recuerdo que fsutilnecesitaba privilegios de administrador incluso para ejecutarse, independientemente de lo que esté haciendo con él.
Joey
1
@AlexanderStohr Buenos puntos. He incluido su comentario en la respuesta para mayor visibilidad.
VonC
8

Con este comando puede encontrar todas las particiones, tamaño y espacio libre: wmic logicaldisk get size, freespace, caption

Dewsri De Mel
fuente
7

Puede evitar las comas usando / -C en el comando 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 desea comparar el espacio disponible con el espacio necesario, puede hacer algo como lo siguiente. Especifiqué el número con un separador de miles y luego los eliminé. Es difícil captar el número sin comas. El SET / A es bueno, pero deja de funcionar con números grandes.

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%
iluminado
fuente
6

La siguiente secuencia de comandos le dará bytes libres en la unidad:

@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%

Tenga en cuenta que esto depende de la salida de su dircomando, que necesita la última línea que contiene el espacio libre del formato 24 Dir(s) 34,071,691,264 bytes free. Específicamente:

  • debe ser la última línea (o puede modificar el forbucle para detectar la línea explícitamente en lugar de confiar en la configuraciónbytesfree de cada línea).
  • el espacio libre debe ser la tercera "palabra" (o puede cambiar el tokens=bit para obtener una palabra diferente).
  • separadores de miles son el ,carácter (o puede cambiar la sustitución de coma a otra cosa).

No contamina el espacio de nombres de su entorno, configurando solo la bytesfreevariable al salir. Si su dirsalida es diferente (por ejemplo, una configuración regional o de idioma diferente), deberá ajustar el script.

paxdiablo
fuente
6

df.exe

Muestra todos sus discos; Capacidad total, usada y libre. Puede modificar la salida mediante varias opciones de la línea de comandos.

Puede obtenerlo en http://www.paulsadowski.com/WSH/cmdprogs.htm , http://unxutils.sourceforge.net/ o en otro lugar. Es un unix-util estándar como du.

df -hmostrará todo el espacio en disco usado y disponible de su unidad. Por ejemplo:

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 de forma gratuita en: https://www.cygwin.com/ Agrega muchas herramientas poderosas al símbolo del sistema. Para obtener solo el espacio disponible en la unidad M (como se asigna en Windows a una unidad compartida), se puede ingresar:

M:\>df -h | grep M: | awk '{print $4}'
tommym
fuente
2
¿Sabes por qué te han perjudicado? Porque no lees la pregunta con atención. Leer: «sin tener que instalar algunas aplicaciones de terceros». Aunque personalmente me gustan los unxutils, no hay respuesta aquí.
LogicDaemon
7
Sigue siendo una respuesta de calidad decente para aquellos que vienen aquí además del OP
Peter
1

Usando la excelente solución de paxdiablo , escribí un script por lotes un poco más sofisticado, que usa la letra de la unidad como argumento entrante y verifica si la unidad existe de una manera complicada (pero no hermosa):

@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)

nota1: puede escribir una letra simple (por ejemplo, x) o puede usar x: o x: \ formato como letra de unidad en el argumento

note2: el script mostrará stderr de% chkfile% solo si el tamaño es mayor que 0

note3: guardé este script como freedisk.cmd (ver uso)

Zsolt Hidasi
fuente
1

Hago una variación para generar esto desde el script:

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

Utilizo diskpart para obtener esta información.

@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
fuente
0

¿Es cscript una aplicación de terceros? Sugiero probar Microsoft Scripting , donde puede usar un lenguaje de programación (JScript, VBS) para verificar cosas como Listar espacio disponible en disco .

La infraestructura de secuencias de comandos está presente en todas las versiones actuales de Windows (incluida la 2008).

gimel
fuente
1
cscript es Microsoft Scripting. Es la versión de consola del intérprete de secuencias de comandos de Windows ( wscriptes la versión de GUI).
Synetech
Debo asumir que "instalación de terceros" significa "cualquier instalación de software adicional". que el aspecto práctico de no tener que proporcionar ni instalar nada. solo medios a bordo.
Alexander Stohr