Wolne miejsce w powłoce CMD

97

Czy istnieje sposób na uzyskanie ilości wolnego miejsca na dysku lub folderu w CMD bez konieczności instalowania aplikacji innych firm?

Mam CMD, który kopiuje duży plik do podanego katalogu i mógłby oczywiście skorzystać z powrotu poziomu błędu z polecenia copy, ale potem muszę poczekać na czas potrzebny do skopiowania pliku (np ... do tego wtedy dysk jest pełny i operacja kopiowania kończy się niepowodzeniem).

Chciałbym wiedzieć, zanim zacznę kopiować, czy to w ogóle jakiś pomysł. Wypróbowano narzędzie DU.EXE firmy Sysinternals, ale pokazuje ono tylko zajęte miejsce.

Ned Batchelder
źródło
Muszę założyć, że „instalacja strony trzeciej” oznacza raczej „każdą instalację dodatkowego oprogramowania”. że praktyczny aspekt braku konieczności dostarczania ani instalowania czegokolwiek. tylko na pokładzie oznacza.
Alexander Stohr

Odpowiedzi:

116

Jeśli uruchomisz „ dir c:\”, ostatnia linia zwróci wolne miejsce na dysku.

Edycja: lepsze rozwiązanie: „ fsutil volume diskfree c:

Nico
źródło
1
Działa również z punktami montowania, co nie dotyczy dir!
LogicDaemon
2
Dir działa dobrze, ale pamiętaj, że musisz utworzyć fałszywy plik, jeśli twój dysk jest pusty. W przeciwnym razie nie zapewnia wolnego miejsca na dysku (<3 Ms :)
Balmipour
czy jest sposób, aby uzyskać tylko liczbę wolnych bajtów?
Mina Jacob
Poza tym, z wyjątkiem katalogu głównego, dir ..*(lub dir c:\thing\..*) pokaże bardzo krótką listę, niezależnie od tego, czy w katalogu jest zero lub wiele plików.
azhrei
fsutil way może nie działać w przypadku dysków wirtualnych, takich jak IMDisk RAM Drive. Otrzymasz: Błąd: Niepoprawna funkcja. Narzędzie FSUTIL wymaga lokalnego woluminu NTFS.
user2846246
51

Możliwe rozwiązanie:

dir|find "bytes free"

bardziej „ zaawansowane rozwiązanie ”, dla systemu Windows XP i nowszych:

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

Windows Management Instrumentation wiersza polecenia (WMIC) narzędzia (Wmic.exe) może gromadzić ogromne ilości informacji o systemie Windows Server 2003 oraz Windows XP lub Vista. Narzędzie uzyskuje dostęp do podstawowego sprzętu za pomocą Instrumentacji zarządzania Windows (WMI). Nie dla Windows 2000.


Jak zauważył Alexander Stohr w komentarzach :

  • WMIC widzi również ograniczenia wynikające z zasad. (nawet jeśli „ dir” nadal będzie działać),
  • dir” zależy od ustawień regionalnych.
VonC
źródło
5
+1 dla WMI. Powinien być jedynym stabilnym rozwiązaniem. Poleganie na konkretnym języku (do znalezienia) jest prawdopodobnie złym pomysłem :)
Joey
Aby umieścić wolną przestrzeń w zmiennej, można użyć:@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: Myślę, że pamiętam fsutil, że potrzebowałem uprawnień administratora, aby w ogóle działać, niezależnie od tego, co z nim robisz.
Joey
1
@AlexanderStohr Zalety. W odpowiedzi zawarłem Twój komentarz, aby uzyskać lepszą widoczność.
VonC
8

Za pomocą tego polecenia możesz znaleźć wszystkie partycje, rozmiar i wolne miejsce: wmic logicaldisk get size, freespace, caption

Dewsri De Mel
źródło
7

Możesz uniknąć przecinków, używając / -C w poleceniu DIR.

FOR /F "usebackq tokens=3" %%s IN (`DIR C:\ /-C /-O /W`) DO (
    SET FREE_SPACE=%%s
)
ECHO FREE_SPACE is %FREE_SPACE%

Jeśli chcesz porównać dostępną przestrzeń z potrzebną przestrzenią, możesz zrobić coś podobnego do poniższego. Podałem liczbę za pomocą separatora tysięcy, a następnie je usunąłem. Trudno jest uchwycić liczbę bez przecinków. SET / A jest fajny, ale przestaje działać z dużymi liczbami.

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%
oświetlony
źródło
6

Poniższy skrypt zapewni Ci wolne bajty na dysku:

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

Zauważ, że zależy to od wyniku twojego dirpolecenia, które wymaga ostatniej linii zawierającej wolne miejsce formatu 24 Dir(s) 34,071,691,264 bytes free. Konkretnie:

  • musi to być ostatnia linia (lub możesz zmodyfikować forpętlę, aby jawnie wykryła linię, zamiast polegać na ustawieniach bytesfreedla każdej linii).
  • wolne miejsce musi być trzecim „słowem” (lub możesz zmienić tokens=bit, aby uzyskać inne słowo).
  • Separatory tysięcy to ,znak (lub możesz zmienić podstawienie z przecinka na coś innego).

Nie zanieczyszcza przestrzeni nazw środowiska, ustawiając tylko bytesfreezmienną przy wyjściu. Jeśli dirwynik jest inny (np. Inne ustawienia regionalne lub językowe), będziesz musiał dostosować skrypt.

paxdiablo
źródło
6

df.exe

Pokazuje wszystkie twoje dyski; całkowita, używana i wolna pojemność. Dane wyjściowe można zmienić za pomocą różnych opcji wiersza polecenia.

Możesz go pobrać z http://www.paulsadowski.com/WSH/cmdprogs.htm , http://unxutils.sourceforge.net/ lub gdzie indziej. Jest to standardowe narzędzie uniksowe, takie jak du.

df -hpokaże całe zajęte i dostępne miejsce na dysku. Na przykład:

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 jest dostępny bezpłatnie pod adresem : https://www.cygwin.com/ Dodaje wiele potężnych narzędzi do wiersza poleceń. Aby uzyskać tylko dostępne miejsce na dysku M (odwzorowane w systemie Windows na dysk współdzielony), można wpisać:

M:\>df -h | grep M: | awk '{print $4}'
tommym
źródło
2
czy wiesz, dlaczego zostałeś pomniejszony? Ponieważ nie czytasz uważnie pytania. Przeczytaj: „bez konieczności instalowania aplikacji innych firm”. Chociaż osobiście lubię unxutils, tutaj nie ma odpowiedzi.
LogicDaemon
7
To wciąż przyzwoita odpowiedź dla tych, którzy przyjeżdżają tutaj poza PO
Peter
1

Korzystając z doskonałego rozwiązania paxdiablo , napisałem nieco bardziej wyrafinowany skrypt wsadowy, który używa litery dysku jako przychodzącego argumentu i sprawdza, czy dysk istnieje w trudny (ale nie piękny) sposób:

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

uwaga1: możesz wpisać prostą literę (np. x) lub możesz użyć formatu x: lub x: \ jako litery dysku w argumencie

note2: skrypt wyświetli stderr z% chkfile% tylko wtedy, gdy rozmiar jest większy niż 0

note3: Zapisałem ten skrypt jako freedisk.cmd (zobacz użycie)

Zsolt Hidasi
źródło
1

Robię wariację, aby wygenerować to ze skryptu:

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

Używam diskpart, aby uzyskać te informacje.

@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
źródło
0

Czy cscript to aplikacja innej firmy? Proponuję wypróbować Microsoft Scripting , w którym możesz użyć języka programowania (JScript, VBS), aby sprawdzić takie rzeczy, jak lista dostępnych miejsc na dysku .

Infrastruktura skryptowa jest obecna we wszystkich aktualnych wersjach systemu Windows (w tym 2008).

gimel
źródło
1
cscript to Microsoft Scripting. Jest to konsolowa wersja interpretera skryptów systemu Windows ( wscriptjest to wersja GUI).
Synetech
Muszę założyć, że „instalacja strony trzeciej” oznacza raczej „każdą instalację dodatkowego oprogramowania”. że praktyczny aspekt braku konieczności dostarczania ani instalowania czegokolwiek. tylko na pokładzie oznacza.
Alexander Stohr