Em um arquivo .bat, como posso testar o espaço em disco disponível?

7

Eu tenho um script .bat, que inicia ao ligar um servidor de backup dedicado, salva o ambiente produtivo usando o Robocopy e encerra o servidor quando terminar.

Ele faz algumas verificações antes de salvar e solicita medidas apropriadas quando algo não está correto, por exemplo, quando o caso do JBOD de destino não foi detectado devido ao desligamento.

Há mais uma advertência, porém, que eu não consegui entender até agora.

Como posso testar no arquivo .bat, se tenho espaço suficiente nos discos de destino para receber todos os arquivos ou não? (Não há problema em testar um tamanho de espaço fixo, modificado periodicamente; atualmente está próximo de 100 GB.)

É mesmo possível? Se sim, qual comando eu preciso pesquisar?

    
por Herb 20.05.2017 / 14:57

2 respostas

12

Sugiro usar um script do PowerShell para isso.

wmic retorna o tamanho em bytes, o lote é limitado a comparações de números de inteiros de 32 bits assinados, muito abaixo de 100 GB. Você teria que truncar o número primeiro.

PowerShell

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

Eu tenho que estender as informações acima sobre comparação de números em lote .
Se os números estiverem contidos em sequências de comprimento igual, eles poderão ser comparados de maneira válida como strings.
Uma comparação de string ocorre caractere por caractere, um espaço inicial / zero é menor que 1.

No momento, o maior tamanho de disco rígido é 10TB = 10995116277760 bytes, com 14 casas decimais - o lote a seguir usa 15 locais para todos os 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
)

Exemplo de saída:

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

> Check-FreeSpace.cmd
FreeSpace="  1181504520192"
   100 GB="   107374182400"
yes enough free space
    
por 20.05.2017 / 16:18
8

A maneira mais simples é ver a última linha em dir output

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

No entanto, não é confiável. E também observe que às vezes você tem muito espaço livre, mas não pode gravar mais arquivos porque atingiu alguns limites, como o tamanho máximo do arquivo ou o número máximo de arquivos em um volume / diretório ...

A maneira mais correta é

wmic LogicalDisk where DeviceID='C:' Get FreeSpace /value
    
por 20.05.2017 / 15:12