Determine se a unidade C tem 2 GB de espaço livre em disco

7

Estou tentando determinar se um PC de destino tem pelo menos 2 GB de espaço livre. Aqui está o que eu tenho até agora:

@echo off
for /f "usebackq delims== tokens=2" %%x in ('wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value') do set "FreeSpace=%%x"
IF /i %FreeSpace% GTR "2147483648" (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)

Não importa se eu definir 2 GB ou alterá-lo para 200 GB, ele sempre diz que tenho espaço suficiente, mesmo que essa unidade tenha apenas 90 GB ... Por favor, ajude se puder.

essa questão foi baseada no código acima: Verifique o espaço livre em disco usando os comandos Batch

parece que deve funcionar, mas não funciona.

    
por Sean Beegle 19.12.2014 / 20:16

4 respostas

11

Você tem 2 problemas com seu código:

1) SE somente faz uma comparação numérica se a string em ambos os lados for avaliada para um número. Seu lado esquerdo é numérico, mas seu lado direito tem aspas, o que força toda a comparação a ser feita usando semântica de string. Os dígitos numéricos sempre classificam mais alto que um caractere de aspas, portanto, sempre informa TRUE.

Como austinian sugere em sua resposta, remover as aspas aparentemente dá a resposta correta no seu caso. Mas essa não é a história toda! Na realidade, está verificando se o espaço livre é maior ou igual a 2147483647.

2) Os números em lote do Windows (cmd.exe) estão limitados à precisão assinada de 32 bits, que equivale a um valor máximo de 2 GB -1 byte (2147483647). A instrução IF tem um valor ímpar (talvez infeliz) comportamento que qualquer número maior que 2147483647 é tratado como igual a 2147483647. Portanto, você não pode usar sua técnica para testar o espaço livre para valores maiores que 2147483647.

Consulte o link para obter mais informações.

Descrita na resposta do link é uma técnica que você pode usar para testar grandes números. Você deve deixar os dois lados da condição na mesma largura e forçar uma comparação de caracteres.

Por exemplo, O seguinte testará se o espaço livre é > = 4294967296 (4 GB)

@echo off
setlocal
set "pad=000000000000000"
set "NeededSpace=%pad%4294967296"
for /f "delims== tokens=2" %%x in (
  'wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value'
) do for %%y in (%%x) do set "FreeSpace=%pad%%%y"
if "%FreeSpace:~-15%" geq "%NeededSpace:~-15%" echo Drive has at least 4 GB free space.
    
por 19.12.2014 / 22:21
3

Retire o " s em torno do número e o script quase funciona corretamente. Usar o " s força uma comparação de string em vez de uma comparação numérica.

Como observa dbenham, o CMD armazena (e compara) números apenas como entradas assinadas de 32 bits. Como estamos verificando GB, podemos ignorar razoavelmente vários dígitos menos significativos. Se removermos os últimos 6 dígitos, ainda teremos a resolução MB, sendo capazes de detectar corretamente até 2 exabytes de espaço livre. Além disso, como notamos, temos que cortar "Number of Digits Removed" + 1 do resultado da WMIC, devido a um caractere extra no final.

@ECHO off
SETLOCAL EnableDelayedExpansion
FOR /f "usebackq delims== tokens=2" %%x IN ('wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value') DO SET "FreeSpaceBig=%%x"
SET FreeSpace=!FreeSpaceBig:~0,-7!
IF %FreeSpace% GTR 2147 (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)
ENDLOCAL

OBSERVAÇÃO: você também não precisa do /i aqui, pois é apenas para comparação de strings e estamos fazendo uma comparação de inteiros. Além disso, poderíamos usar dir c:\ /-C | find "bytes free" em vez de wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value , se você quiser evitar invocar o WMI para essa operação (o que nos permite omitir o EnableDelayedExpansion e usar % em vez de ! em torno de FreeSpaceBig on line 4. Enfim, é scripting, geralmente há muitas maneiras de fazer o trabalho.

RELACIONADO:

link link link

    
por 19.12.2014 / 20:30
0

Se você só precisa verificar se a unidade tem espaço livre suficiente (para instalar ou copiar algo, por exemplo), você pode tentar uma consulta wmic assim:

wmic LogicalDisk where "DeviceID='c:' and FreeSpace > 10737418240" get DeviceID 2>&1 ^ | find /i "c:" >nul || (echo not enough space&exit 1)

isso interromperá a execução do arquivo em lote se houver menos de 10 GB livres em C:

    
por 19.02.2018 / 15:07
-2

Aqui está uma maneira diferente de fazer isso ... mas não é muito preciso.

Esse método usa operações de comprimento de string contra o "número de bytes livres" listado em dir e as propriedades da unidade.

for /f "tokens=3" %%a in ('dir T:\') do (
 set bytesfree=%%a
)
ECHO %bytesfree%>x&FOR %%? IN (x) DO SET /A strlen=%%~z? - 2&del x
IF %strlen% LEQ 13 (

)

O exemplo específico acima determina se há menos de 10 GB de espaço livre na unidade T.

Eu só queria compartilhar essa maneira pouco ortodoxa de fazer isso para quem não gosta muito de código.

    
por 14.01.2016 / 04:22