Spazio libero in una shell CMD


95

C'è un modo per ottenere la quantità di spazio libero su disco di un disco o di una cartella in un CMD senza dover installare alcune applicazioni di terze parti?

Ho un CMD che copia un file di grandi dimensioni in una determinata directory e ovviamente potrei usare il livello di errore restituito dal comando di copia, ma poi devo aspettare il tempo necessario per copiare il file (ad esempio ... a quello quindi il il disco è pieno e l'operazione di copia non riesce).

Vorrei sapere prima di iniziare la copia se è un'idea. Ho provato l'utilità DU.EXE da Sysinternals, ma quello mostra solo lo spazio occupato.


devo presumere che "installazione di terze parti" significhi piuttosto "qualsiasi installazione di software extra". che l'aspetto pratico di non dover fornire né installare nulla. solo mezzi a bordo.
Alexander Stohr il

Risposte:


112

Se esegui " dir c:\", l'ultima riga ti darà lo spazio libero su disco.

Modifica: soluzione migliore: " fsutil volume diskfree c:"


1
E funziona anche con i mountpoint, che non è il caso di dir!
LogicDaemon

2
Dir funziona bene, ma tieni presente che dovrai creare un file fittizio se l'unità è vuota. Altrimenti, non lascia spazio libero sull'unità (<3 Ms :)
Balmipour

c'è un modo per ottenere solo il numero di byte liberi?
Mina Jacob,

Inoltre, ad eccezione della directory root, dir ..*(o dir c:\thing\..*) mostrerà un elenco molto breve, indipendentemente dal fatto che ci siano o meno zero o molti file nella directory.
azhrei

Il modo fsutil potrebbe non funzionare per unità virtuali come IMDisk RAM Drive. Riceverai: Errore: funzione non corretta. L'utilità FSUTIL richiede un volume NTFS locale.
user2846246

51

Una possibile soluzione:

dir|find "bytes free"

una " soluzione più avanzata ", per Windows Xp e oltre:

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

Lo strumento della riga di comando di Strumentazione gestione Windows (WMIC) (Wmic.exe) può raccogliere grandi quantità di informazioni su Windows Server 2003, Windows XP o Vista. Lo strumento accede all'hardware sottostante utilizzando Strumentazione gestione Windows (WMI). Non per Windows 2000.


Come notato da Alexander Stohr nei commenti :

  • WMIC può visualizzare anche le restrizioni basate su criteri. (anche se " dir" farà comunque il lavoro),
  • " dir" dipende dalla localizzazione.

5
+1 per WMI. Dovrebbe essere l'unica soluzione stabile. Affidarsi a una lingua specifica (per trovare) è probabilmente una cattiva idea :)
Joey

Per mettere lo spazio libero in una variabile si potrebbe usare quanto segue:@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: Penso di ricordare di fsutilaver bisogno dei privilegi di amministratore anche per funzionare, indipendentemente da quello che stai facendo con esso.
Joey


1
@AlexanderStohr Buoni punti. Ho incluso il tuo commento nella risposta per una maggiore visibilità.
VonC

8

Usando questo comando puoi trovare tutte le partizioni, le dimensioni e lo spazio libero: wmic logicaldisk get size, freespace, caption


7

È possibile evitare le virgole utilizzando / -C sul 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 vuoi confrontare lo spazio disponibile con lo spazio necessario, potresti fare qualcosa come il seguente. Ho specificato il numero con il separatore delle migliaia, quindi li ho rimossi. È difficile capire il numero senza virgole. Il SET / A è carino, ma smette di funzionare con grandi numeri.

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%

6

Il seguente script ti darà byte gratuiti sull'unità:

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

Nota che questo dipende dall'output del tuo dircomando, che necessita dell'ultima riga contenente lo spazio libero del formato 24 Dir(s) 34,071,691,264 bytes free. Nello specifico:

  • deve essere l'ultima riga (oppure è possibile modificare il forciclo per rilevare la riga in modo esplicito anziché fare affidamento sull'impostazione bytesfreeper ogni riga).
  • lo spazio libero deve essere la terza "parola" (oppure puoi cambiare il tokens=bit per ottenere una parola diversa).
  • migliaia di separatori sono il ,carattere (oppure puoi cambiare la sostituzione da virgola a qualcos'altro).

Non inquina lo spazio dei nomi del tuo ambiente, impostando solo la bytesfreevariabile in uscita. Se l' diroutput è diverso (ad esempio, impostazioni locali o di lingua diverse), sarà necessario modificare lo script.


6

df.exe

Mostra tutti i tuoi dischi; capacità totale, utilizzata e libera. È possibile modificare l'output tramite varie opzioni della riga di comando.

Puoi scaricarlo da http://www.paulsadowski.com/WSH/cmdprogs.htm , http://unxutils.sourceforge.net/ o da qualche altra parte. È un unix-util standard come du.

df -hmostrerà tutto lo spazio su disco utilizzato e disponibile dell'unità. Per esempio:

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 è disponibile gratuitamente su: https://www.cygwin.com/ Aggiunge molti potenti strumenti al prompt dei comandi. Per ottenere solo lo spazio disponibile sull'unità M (come mappato in Windows su un'unità condivisa), si potrebbe inserire:

M:\>df -h | grep M: | awk '{print $4}'

2
sai perché sei stato minused? Perché non leggi attentamente la domanda. Leggi: «senza dover installare alcune applicazioni di terze parti». Anche se personalmente mi piacciono gli unxutils, non è la risposta qui.
LogicDaemon

7
È ancora una risposta di qualità decente per coloro che vengono qui oltre all'OP
Peter

1

Usando la soluzione eccellente paxdiablo ho scritto uno script batch un po 'più sofisticato, che utilizza la lettera di unità come argomento in arrivo e controlla se l'unità esiste in un modo complicato (ma non bello):

@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: puoi digitare una lettera semplice (es. x) o usare x: o x: \ format come lettera di unità nell'argomento

nota2: lo script mostrerà stderr da% chkfile% solo se la dimensione è maggiore di 0

nota3: ho salvato questo script come freedisk.cmd (vedi utilizzo)


1

Faccio una variazione per generarlo dallo script:

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

Uso diskpart per ottenere queste informazioni.

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

0

Cscript è un'app di terze parti? Suggerisco di provare Microsoft Scripting , dove puoi usare un linguaggio di programmazione (JScript, VBS) per controllare cose come List Available Disk Space .

L'infrastruttura di scripting è presente su tutte le attuali versioni di Windows (incluso il 2008).


1
cscript è Microsoft Scripting. È la versione console dell'interprete di scripting di Windows ( wscriptè la versione GUI).
Synetech

devo presumere che "installazione di terze parti" significhi piuttosto "qualsiasi installazione di software extra". che l'aspetto pratico di non dover fornire né installare nulla. solo mezzi a bordo.
Alexander Stohr il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.