Отримайте розмір диска / розділу в пакетному файлі


1

Як отримати загальний розмір диска або розділу (USB-жорсткий диск з розділом 1 NTFS) у пакетному файлі?
Я б краще не пішов на логіку, яка переходить через файли рекурсивно (ті, які мають для / f), оскільки це диск на 1 ТБ, і для визначення розміру може знадобитися багато часу.

Я відкритий для використання невеликого стороннього інструменту, який поверне розмір до пакетного файлу.

PS: Я в Windows 7 x64 Ultimate


Я припускаю, що ОС Windows з тексту питання, але яка версія? Чи можете ви оновити теги питань та текст.
Джуліан Найт

Відповіді:


3

Можливо, є простіший спосіб зробити це, але ось що я використовую

Якщо все, що вам потрібно, - це байти, ви можете просто виконати цю команду, щоб змінити T на літеру диска вашого зовнішнього (для одного вкладиша в командному рядку змінити %%на %та set space=на echo)

for /f "tokens=3 delims= " %%a in ('dir /-c T: ^| find "bytes free"') do set space=%%a

якщо ви хочете взяти це та спростити його, спочатку встановіть рекомендації для кожного розміру

set divide=1073741824&&set size=gigabytes
if %space% lss 1073741824 set divide=1048576&&set size=megabytes
if %space% lss 1048576 set divide=1024&&set size=kilobytes
if %space% lss 1024 set divide=1&&set size=bytes

Потім напишіть тимчасовий сценарій VBS, оскільки партія не може обробити математику

echo wsh.echo cdbl(%space%)/%divide% > %temp%\tmp.vbs

Запустіть його, захопіть результат і видаліть його

for /f %%a in ('cscript //nologo %temp%\tmp.vbs') do set space=%%a
del %temp%.\tmp.vbs

Потім наступні результати підрізають два знаки після коми

for /f "tokens=1,2 delims=." %%a in ("%space%") do (
  set s1=%%a
  set s2=%%b
)
if not "%s2%"=="" (set space=%s1%.%s2:~0,2%) else (set space=%s1%)

Ехо-результати

echo Drive has %space% %size% free.

[EDIT]

Для загального розміру ви можете використовувати обсяг списку дискових частин (змінити "%%a"=="T"на "%%a"=="driveletterhere")

for /f "tokens=3,6,7 delims= " %%a in ('echo list volume ^| diskpart') do if "%%a"=="T" set size=%%b && set size2=%%c

і бонус, як ви могли це обчислити:

if [%size2%]==[TB] (
    set isBigEnough=1
) else if [%size2%]==[GB] (
    if %size% GTR 31 set isBigEnough=1
)
if not defined isBigEnough set isBigEnough=0

Я вважаю, що це вільний простір. Я хочу за загальний розмір. В основному я хочу виконати якусь команду, тільки якщо розмір диска менше 32 ГБ. Я припускаю, що тоді мені не доведеться займатися математикою ..
tumchaaditya

Це насправді простіше, дивіться мою редакцію рішення щодо загального розміру.
Патрік Майнек

Дякую, людина .. Просто редагування .. у моєму випадку має бути 3,7,8..може бути diskpart, показує додатковий стовпець ... ще одна річ ... я не зовсім зрозумів частину "в ( 'том ехо списку ^ | дискпарт') "... як це працює? тому що якщо мені це потрібно зробити вручну, спочатку доведеться запустити diskpart, а потім перерахувати том .... як він передає обсяг списку всередині diskpart?
tumchaaditya

якщо ви введете, echo list volume | diskpartви побачите, що list volumeце повторюється diskpart, це можна зробити як з командного рядка, так і до тих пір, поки ви не будете скасовуватися |. І не впевнений, чому жетони для вас різні, але я радий, що ви могли це зрозуміти.
Патрік Мейнекк

інша проблема .. Ім'я тома може містити пробіли чи не містити їх ... тому щоразу змінюється
розмежування

1

Можливо, спробуйте, df.exeякий доступний на веб-сайті http://unxutils.sourceforge.net/ та інших місцях. Це копія інструменту командного рядка UNIX.

Ви також повинні мати можливість отримувати значення безпосередньо з інтерфейсу управління Windows (WMI), хоча я боюся, що мої навички в цій галузі недостатньо хороші, щоб дати пряму відповідь.

fsutil volume diskfree c:дасть вам 3 рядки виводу, які ви, ймовірно, могли використати findна, щоб отримати бажаний результат.

Приклад виводу:

Total # of free bytes        : 466333454336
Total # of bytes             : 972999880704
Total # of avail free bytes  : 466333454336

fsutil volume diskfree c: | find "Total # of bytes" дає вам конкретний рядок.

for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

дає номер із попереднім пробілом.

Для порівняння:

@REM 32MB = 32*1024*1024 bytes
@set COMP=33554432

@REM Pull out the line containing the number of bytes USED
for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

@REM Drop the leading space character to just get the number so a numeric comparison is done
for /F "tokens=1 delims= " %i in ('echo %USED%') do @set USED=%i

@REM Tell me something useful
if %USED% lss %COMP% @echo "Used is less than 32MB"
if %USED% gtr %COMP% @echo "Used is greater than 32MB"

ПРИМІТКА: fsutil вимагає прав адміністратора, тому це може не працювати на заблокованих комп'ютерах.


Спасибі людина. fsutil річ працює. Я розробив процедуру виведення остаточного розміру (лише для / f). Я додам цю інформацію до вашої відповіді і відзначу її як прийняту.
tumchaaditya

Я оновив рішення. Але я хочу зробити далі - порівняти цей розмір з числом (32 ГБ, перетвореним в байти, щоб бути конкретним) і виконати команду, якщо розмір менше 32 ГБ. Будь-яка ідея, як порівняти отриманий рядок з числом?
tumchaaditya

Все звучить ідеально, за винятком того, що я отримав би вільний розмір місця. Але, мені потрібен повний розмір диска ..
tumchaaditya

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