Espaço livre em um shell CMD

95

Existe uma maneira de obter a quantidade de espaço livre em disco de um disco ou pasta em um CMD sem ter que instalar alguns aplicativos de terceiros?

Eu tenho um CMD que copia um arquivo grande para um determinado diretório e poderia, é claro, usar o retorno de nível de erro do comando de cópia, mas então tenho que esperar o tempo que leva para copiar o arquivo (por exemplo ... para isso então o o disco está cheio e a operação de cópia falha).

Eu gostaria de saber antes de começar a cópia se é alguma ideia. Tentei usar o utilitário DU.EXE da Sysinternals, mas aquele show ocupava apenas espaço.

Ned Batchelder
fonte
devo assumir que a "instalação de terceiros" significa, em vez disso, "qualquer instalação de software extra". que o aspecto prático de não precisar fornecer nem instalar nada. apenas meios de bordo.
Alexander Stohr

Respostas:

112

Se você executar " dir c:\", a última linha fornecerá o espaço livre em disco.

Editar: Melhor solução: " fsutil volume diskfree c:"

Nico
fonte
1
E também funciona com pontos de montagem, o que não é o caso com dir!
LogicDaemon
2
Dir funciona bem, mas observe que você terá que criar um arquivo fictício se sua unidade estiver vazia. Caso contrário, não dá espaço livre à unidade (<3 Ms :)
Balmipour
existe uma maneira de obter apenas o número de bytes livres?
Mina Jacob
Além disso, exceto para o diretório raiz, dir ..*(ou dir c:\thing\..*) mostrará uma lista muito curta, se houver zero ou muitos arquivos no diretório.
azhrei
A maneira fsutil pode não funcionar para unidades virtuais como o IMDisk RAM Drive. Você obterá: Erro: Função incorreta. O utilitário FSUTIL requer um volume NTFS local.
user2846246
51

Uma possível solução:

dir|find "bytes free"

uma " solução mais avançada ", para Windows XP e além:

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

A ferramenta de linha de comando do Windows Management Instrumentation (WMIC) (Wmic.exe) pode reunir grandes quantidades de informações sobre o Windows Server 2003, bem como o Windows XP ou Vista. A ferramenta acessa o hardware subjacente usando o Windows Management Instrumentation (WMI). Não para Windows 2000.


Conforme observado por Alexander Stohr nos comentários :

  • O WMIC também pode ver as restrições baseadas em políticas. (mesmo se 'dir ' ainda funcione),
  • ' dir' depende da localidade.
VonC
fonte
5
1 para WMI. Deve ser a única solução estável. Contar com um idioma específico (para encontrar) é provavelmente uma má ideia :)
Joey
Para colocar o espaço livre em uma variável, pode-se usar o seguinte:@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: Acho que me lembro de fsutilprecisar de privilégios de administrador para executar, independentemente do que você esteja fazendo com ele.
Joey
1
@AlexanderStohr Pontos positivos. Eu incluí seu comentário na resposta para mais visibilidade.
VonC
8

Usando este comando, você pode encontrar todas as partições, tamanho e espaço livre: wmic logicaldisk get size, freespace, caption

Dewsri De Mel
fonte
7

Você pode evitar as vírgulas usando / -C no 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%

Se você quiser comparar o espaço disponível com o espaço necessário, pode fazer algo como o seguinte. Especifiquei o número com separador de milhares e os removi. É difícil entender o número sem vírgulas. O SET / A é legal, mas para de funcionar com 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%
aceso
fonte
6

O script a seguir fornecerá bytes livres na unidade:

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

Observe que isso depende da saída do seu dircomando, que precisa da última linha contendo o espaço livre do formato 24 Dir(s) 34,071,691,264 bytes free. Especificamente:

  • deve ser a última linha (ou você pode modificar o forloop para detectar a linha explicitamente ao invés de confiar na configuraçãobytesfree para cada linha).
  • o espaço livre deve ser a terceira "palavra" (ou você pode alterar o tokens=bit para obter uma palavra diferente).
  • separadores de milhares são o ,caractere (ou você pode alterar a substituição de vírgula para outra coisa).

Ele não polui o namespace do seu ambiente, definindo apenas a bytesfreevariável na saída. Se sua dirsaída for diferente (por exemplo, configurações de local ou idioma diferentes), você precisará ajustar o script.

paxdiablo
fonte
6

df.exe

Mostra todos os seus discos; capacidade total, usada e livre. Você pode alterar a saída por várias opções de linha de comando.

Você pode obtê-lo em http://www.paulsadowski.com/WSH/cmdprogs.htm , http://unxutils.sourceforge.net/ ou em outro lugar. É um utilitário unix padrão como du.

df -hirá mostrar todo o espaço em disco usado e disponível na sua unidade. Por exemplo:

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

O Cygwin está disponível gratuitamente em: https://www.cygwin.com/ Ele adiciona muitas ferramentas poderosas ao prompt de comando. Para obter apenas o espaço disponível na unidade M (conforme mapeado no Windows para uma unidade compartilhada), pode-se inserir:

M:\>df -h | grep M: | awk '{print $4}'
tommym
fonte
2
você sabe por que você foi minimizado? Porque você não lê a pergunta com atenção. Leia: «sem ter que instalar aplicativos de terceiros». Embora eu pessoalmente goste de unxutils, não há uma resposta aqui.
LogicDaemon
7
Ainda é uma resposta de qualidade decente para aqueles que vêm aqui além do OP
Pedro
1

Usando a solução excelente do paxdiablo , escrevi um script em lote um pouco mais sofisticado, que usa a letra da unidade como o argumento de entrada e verifica se a unidade existe de uma maneira complicada (mas não bonita):

@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: você pode digitar uma letra simples (por exemplo, x) ou pode usar o formato x: ou x: \ como a letra da unidade no argumento

note2: o script exibirá stderr de% chkfile% apenas se o tamanho for maior que 0

nota3: salvei este script como freedisk.cmd (consulte o uso)

Zsolt Hidasi
fonte
1

Eu faço uma variação para gerar isso a partir do script:

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

Eu uso o diskpart para obter essas informações.

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

O cscript é um aplicativo de terceiros? Eu sugiro tentar o Microsoft Scripting , onde você pode usar uma linguagem de programação (JScript, VBS) para verificar coisas como List Available Disk Space .

A infraestrutura de script está presente em todas as versões atuais do Windows (incluindo 2008).

gimel
fonte
1
cscript é o Microsoft Scripting. É a versão do console do interpretador de scripts do Windows ( wscripté a versão GUI).
Synetech
devo assumir que a "instalação de terceiros" significa, em vez disso, "qualquer instalação de software extra". que o aspecto prático de não precisar fornecer nem instalar nada. apenas meios de bordo.
Alexander Stohr