Вільний простір у оболонці CMD


95

Чи є спосіб отримати кількість вільного дискового простору диска або папки в CMD без необхідності встановлювати деякі програми сторонніх розробників?

У мене є CMD, який копіює великий файл у заданий каталог і, звичайно, може використовувати повернення рівня помилки з команди copy, але тоді мені доведеться чекати часу, необхідного для копіювання файлу (наприклад, ... диск заповнений і копіювання не вдається).

Я хотів би знати, перш ніж запустити копію, чи це взагалі якась ідея. Спробував утиліту DU.EXE від Sysinternals, але це показує лише зайнятий простір.


я повинен припустити, що "встановлення третьої сторони" швидше означає "будь-яке додаткове встановлення програмного забезпечення". що практичний аспект нічого не потрібно ні передбачати, ні встановлювати. тільки бортові засоби.
Олександр Стор

Відповіді:


112

Якщо ви запустите " dir c:\", останній рядок надасть вам вільний простір на диску.

Редагувати: Краще рішення: " fsutil volume diskfree c:"


1
І він також працює з точками кріплення, що не стосується dir!
LogicDaemon

2
Dir працює добре, але зверніть увагу, що вам доведеться створити фіктивний файл, якщо ваш диск порожній. В іншому випадку це не дає диску вільного місця (<3 Ms :)
Бальміпур,

чи є спосіб отримати просто кількість вільних байтів?
Міна Якоб

Також, за винятком кореневого режиму, dir ..*(або dir c:\thing\..*) буде показано дуже короткий список, незалежно від того, чи є в каталозі нульове чи багато файлів.
ажрей

fsutil спосіб може не працювати для віртуальних дисків, таких як IMDisk RAM Drive. Ви отримаєте: Помилка: Неправильна функція. Утиліта FSUTIL вимагає локального тому NTFS.
користувач2846246

51

Можливе рішення:

dir|find "bytes free"

більш " просунуте рішення " для Windows Xp та пізніших версій:

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

The Інструментарію управління Windows з командного рядка (WMIC) інструмент (Wmic.exe) може зібрати величезну кількість інформації про про Windows Server 2003, а також Windows XP або Vista. Інструмент отримує доступ до базового обладнання за допомогою інструменту управління Windows (WMI). Не для Windows 2000.


Як зазначив Олександр Стохр у коментарях :

  • WMIC також може бачити обмеження на основі політики. (навіть якщо ' dir' все одно буде робити роботу),
  • ' dir' залежить від локальної точки.

5
+1 для WMI. Має бути єдиним стабільним рішенням. Покладатися на певну мову (для пошуку) - це, мабуть, погана ідея :)
Joey

Щоб помістити вільний простір у змінну, можна використати наступне:@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
Давор Йосипович

3
@Pacerier: Я думаю, я пам’ятаю, що fsutilпотрібно навіть привілеї адміністратора для запуску, незалежно від того, що ти з цим робиш.
Joey


1
@AlexanderStohr Добрі моменти. Я включив ваш коментар у відповідь для більшої наочності.
VonC

8

За допомогою цієї команди ви можете знайти всі розділи, розмір та вільний простір: wmic logicaldisk get size, freespace, caption


7

Ви можете уникнути коми, використовуючи / -C за командою DIR.

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

Якщо ви хочете порівняти наявний простір з необхідним простором, ви можете зробити щось подібне. Я вказав число з роздільником тисяч, а потім вилучив їх. Важко зрозуміти число без коми. SET / A приємний, але він перестає працювати з великими номерами.

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

Наступний сценарій дасть вам безкоштовні байти на диску:

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

Зауважте, що це залежить від результату вашої dirкоманди, яка потребує останнього рядка, що містить вільний простір формату 24 Dir(s) 34,071,691,264 bytes free. Конкретно:

  • це повинен бути останній рядок (або ви можете змінити forцикл, щоб явно виявити рядок, а не покладатися на налаштуванняbytesfree для кожного рядка).
  • вільний простір повинен бути третім «словом» (або ви можете змінити tokens=біт, щоб отримати інше слово).
  • тисячі роздільників є ,символом (або ви можете змінити підстановку з коми на щось інше).

Це не забруднює ваше середовище імен середовища, встановлюючи лише bytesfreeзмінну при виході. Якщо ваш dirрезультат відрізняється (наприклад, різні налаштування мови або мови), вам потрібно буде налаштувати сценарій.


6

df.exe

Показує всі ваші диски; загальна, використана та вільна потужність. Ви можете змінити результат, використовуючи різні параметри командного рядка.

Ви можете отримати його з http://www.paulsadowski.com/WSH/cmdprogs.htm , http://unxutils.sourceforge.net/ або деінде. Це стандартний unix-util, як du.

df -hпокаже весь використаний та доступний диск на вашому диску. Наприклад:

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 доступний безкоштовно на веб-сайті : https://www.cygwin.com/ Він додає в командний рядок багато потужних інструментів. Щоб отримати просто доступний простір на диску M (як відображено у вікнах на спільний диск), можна ввести:

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

2
чи знаєте ви, чому вас минусували? Тому що ти не читаєш уважно запитання. Читайте: «без установки іншої програми сторонніх сторін». Хоча мені особисто подобаються unxutils, це тут не відповідає.
LogicDaemon

7
Це все ще гідна якісна відповідь для тих, хто приїжджає сюди, крім ОП
Петро,

1

Використовуючи відмінне рішення paxdiablo, я написав трохи більш складний пакетний сценарій, який використовує букву диска як вхідний аргумент і перевіряє, чи існує диск на хитрому (але не красу) способі:

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

Примітка1: ви можете ввести просту букву (наприклад, x) або використовувати формат x: або x: \ як літеру диска в аргументі

note2: скрипт відображатиме stderr з% chkfile%, лише якщо розмір перевищує 0

Примітка3: Цей сценарій я зберегла як freedisk.cmd (див. використання)


1

Я можу змінити те, щоб генерувати це із сценарію:

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

Я використовую diskpart для отримання цієї інформації.

@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 сторонній програмою? Я пропоную спробувати Microsoft Scripting , де ви можете використовувати мову програмування (JScript, VBS), щоб перевірити такі речі, як Список доступного дискового простору .

Інфраструктура сценаріїв існує у всіх поточних версіях Windows (включаючи 2008 рік).


1
cscript це Microsoft Scripting. Це консольна версія інтерпретатора сценаріїв Windows ( wscriptце версія GUI).
Synetech

я повинен припустити, що "встановлення третьої сторони" швидше означає "будь-яке додаткове встановлення програмного забезпечення". що практичний аспект нічого не потрібно ні передбачати, ні встановлювати. лише бортові засоби.
Олександр Стор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.