Свободное место в оболочке CMD

97

Есть ли способ получить количество свободного дискового пространства на диске или в папке в CMD без необходимости установки сторонних приложений?

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

Прежде чем приступить к копированию, я хотел бы знать, есть ли это вообще идея. Пробовал использовать утилиту DU.EXE от Sysinternals, но она показывает только занимаемое пространство.

Нед Батчелдер
источник
Я должен предположить, что «установка третьей стороной» скорее означает «установку любого дополнительного программного обеспечения». что практический аспект: не нужно ничего ни предоставлять, ни устанавливать. только бортовые средства.
Александр Стоур,

Ответы:

116

Если вы запустите " dir c:\", последняя строка предоставит вам свободное место на диске.

Изменить: Лучшее решение: " fsutil volume diskfree c:"

Нико
источник
1
И он также работает с точками монтирования, чего нельзя сказать о dir!
LogicDaemon 06
2
Dir работает хорошо, но учтите, что вам придется создать фиктивный файл, если ваш диск пуст. В противном случае это не дает свободного места на диске (<3 мс :)
Balmipour
есть ли способ получить только количество свободных байтов?
Mina Jacob
Кроме того, за исключением корневого каталога, dir ..*(или dir c:\thing\..*) покажет очень короткий список, независимо от того, есть ли в каталоге ноль или много файлов.
azhrei
Способ fsutil может не работать для виртуальных дисков, таких как IMDisk RAM Drive. Вы получите: Ошибка: неправильная функция. Утилите FSUTIL требуется локальный том NTFS.
user2846246
51

Возможное решение:

dir|find "bytes free"

более « продвинутое решение » для Windows Xp и выше:

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

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


Как отметил Александр Штор в комментариях :

  • WMIC также может видеть ограничения, основанные на политике. (даже если ' dir' по-прежнему выполняет свою работу),
  • ' dir' зависит от локали.
VonC
источник
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права администратора даже для запуска, независимо от того, что вы с ним делаете.
Джои
1
@ techguy1029 Да: superuser.com/a/924992/141 или superuser.com/a/896771/141
VonC
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вывод отличается (например, другие языковые настройки или языковые настройки), вам нужно будет настроить сценарий.

Paxdiablo
источник
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 (которое отображается в Windows на общий диск), можно ввести:

M:\>df -h | grep M: | awk '{print $4}'
Томми
источник
2
ты знаешь, почему тебя игнорируют? Потому что вы не читаете внимательно вопрос. Прочтите: «без установки сторонних приложений». Хотя мне лично нравится unxutils, здесь нет ответа.
LogicDaemon 06
7
Это все еще достойный качественный ответ для тех, кто приезжает сюда, кроме OP
Питер
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)

note1: вы можете ввести простую букву (например, x) или использовать x: или x: \ format как букву диска в аргументе

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

note3: я сохранил этот скрипт как 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
Я должен предположить, что «установка третьей стороной» скорее означает «установку любого дополнительного программного обеспечения». что практический аспект: не нужно ничего ни предоставлять, ни устанавливать. только бортовые средства.
Александр Стоур,