Pregunta En un archivo .bat, ¿cómo puedo probar el espacio disponible en el disco?


Tengo un script .bat, que se inicia al encender un servidor de respaldo dedicado, guarda el entorno productivo usando Robocopy y apaga el servidor cuando termina.

Realiza algunas comprobaciones antes de guardar y solicita medidas adecuadas cuando algo no está bien, por ejemplo, cuando el caso JBOD objetivo no se detectó debido a que estaba apagado.

Sin embargo, hay una advertencia más que no pude manejar hasta ahora.

¿Cómo puedo probar en el archivo .bat, si tengo suficiente espacio en los discos de destino para recibir todos los archivos o no? (Está bien probar un tamaño de espacio fijo, modificado periódicamente, actualmente es cerca de 100 GB).

¿Es posible? Si es así, ¿qué comando necesito investigar?


7


origen




Respuestas:


Sugiero usar un script de PowerShell para eso.

wmic devuelve el tamaño en bytes, el lote está limitado a comparaciones numéricas de enteros de 32 bits con signo, muy por debajo de 100 GB. Tendría que truncar el número primero.

Potencia Shell

if ((Get-WMIObject Win32_Logicaldisk -filter "deviceid='C:'").FreeSpace -gt 100GB){
  "yes enough free space"
} else {
  "not enough free space"
}

Tengo que extender la información anterior sobre la comparación numérica en lote.
Si los números están contenidos en cadenas de igual longitud, se pueden comparar válidamente como cadenas.
Una comparación de cadenas tiene lugar carácter por carácter, un espacio inicial / cero es menor que 1.

Por el momento, el tamaño más grande de los discos duros es de 10TB = 10995116277760 octetos tomando 14 decimales; el siguiente lote usa 15 lugares para todos los números.

@Echo off
Rem        543210987654321
Set "Blank=               "
Set "GB100=   107374182400"
Set "TB_10= 10995116277760"

for /f "tokens=2" %%A in (
  'wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "C:"'
) Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"

Echo FreeSpace="%FreeSpace%"
Echo    100 GB="%GB100%"

If "%FreeSpace%" gtr "%GB100%" (
  Echo yes enough free space
) else (
  Echo not enough free space
)

Muestra de salida:

> Check-FreeSpace.cmd
FreeSpace="   101606346752"
   100 GB="   107374182400"
not enough free space

> Check-FreeSpace.cmd
FreeSpace="  1181504520192"
   100 GB="   107374182400"
yes enough free space

12



@Bob Stuff y tonterías, 15 lugares decimales tendrán ~ 909.5TB bastante cerca del 1PB actualmente no disponible - pero el concepto es claro y nadie te impide usar 16 lugares para obtener ~ 8.88PB - LotPings
Hm. No hizo exactamente clic en mi cabeza de que había pasado un dígito más allá del valor de 10 TB, lo siento. - Bob


La forma más simple es mirar la última línea en dir salida

dir /-c /w C: | find "bytes free"

Sin embargo, no es confiable. Y también tenga en cuenta que a veces tiene mucho espacio libre pero no puede escribir más archivos porque ha alcanzado algunos límites, como el tamaño máximo de archivo o el número máximo de archivos en un volumen / directorio ...

La forma más correcta es

wmic LogicalDisk Get DeviceID,FreeSpace | find /i "C:"

8



Sospecho que find /i "C:" una parte no haría lo que esperas si tienes varias particiones montadas en rutas que comiencen por C:. Windows lo ha permitido desde 2000-ish, pero no es una característica muy utilizada, por lo que este podría no será un problema en el caso del OP, pero probablemente no sea "la forma más correcta" de hacerlo. - Michael Kjörling
@ MichaelKjörling si la unidad está montada en path\to\mountpoint entonces dir /-c /w path\to\mountpoint | find "bytes free" todavía funciona. Es posible que necesite una secuencia de comandos de apoyo con mountvol si quieres que funcione con wmic - phuclv