Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/99: Рейтинг темы: голосов - 99, средняя оценка - 4.51
denisk37
11 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 10
#1

Проверка свободного места на диске в cmd

16.03.2013, 22:50. Просмотров 17778. Ответов 16
Метки нет (Все метки)

Пользуясь подсказками Dragokas и яндекса сделал для себя такую штуку freespace.cmd
после её запуска получаю файлик freespace.cmd.txt:
Windows Batch file
1
2
3
4
Free space C:  128 Gb of  160 Gb
Free space D:  410 Gb of  500 Gb
Free space E:  16 Gb of  20 Gb
Free space F:  1038 Gb of  1479 Gb
Сам командник:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
setlocal enableextensions enabledelayedexpansion
echo.>%0.txt
 for %%j in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
 rem echo %%j
 
 
set sFreeSize=0
set /a c=0
for /f "skip=1 tokens=2 delims=:" %%i in ('fsutil volume diskfree %%j:') do (
  set /a c+=1
  rem echo !c! %%i
  if !c!==1 set sFreeSizeOf=%%i
  if !c!==2 set sFreeSize=%%i
)
 
if NOT !sFreeSize!==0 echo Free space %%j: !sFreeSize:~0,-9! Gb of !sFreeSizeOf:~0,-9! Gb>>%0.txt
rem :~0,-9
 )
endlocal
p.s.1. дальше его хватаю и отправляю себе на мыло zerat-кой
p.s.2. Размеры взяты грубо и формально неправильно: перевод в Gb ведется тупо обрезанием последних 9-ти цифорок. Но дает общую картину.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2013, 22:50
Ответы с готовыми решениями:

Определить общее количество ОЗУ и свободного места на системном диске
Доброго времени суток. Нужно определить общее количество оперативной памяти...

Определить размер свободного места в байтах на текущем разделе харда
Короче, надо создать батник, который бы записал в переменную кол-во байт...

Что произойдет при нехватке свободного места во время обновления архива?
Возникло несколько вопросов: 1) Что будет, если на том диске, где лежит...

Вывод для любого доступного диска величины свободного пространства на этом диске
Создать .bat файл, конкретно Разработать и выполнить командный файл (КФ),...

Проверить, существует ли файл на диске в cmd
Я написал следующий скрипт: @echo off d: if exist goddamn.txt ( echo...

16
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,839
Записей в блоге: 16
17.03.2013, 04:54 #2
Неплохой скрипт. Только будет требовать повышенных прав запуска в ОС >= Vista с UAC.

Особенно понравился момент сравнения меня с яндексом ))

Цитата Сообщение от denisk37 Посмотреть сообщение
перевод в Gb ведется тупо обрезанием последних 9-ти цифорок.
Дам Вам еще пищу для размышлений.
Только что написал от себя (хоть и деревянный), но рабочий скрипт поразрядного деления (с разг. "деление в столбик"). Т.е. еще другими словами: обход ограничения CMD на предельное значение числового типа данных.
Можете воспользоваться наработкой:

StrDiv.CMD

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@echo off
SetLocal EnableDelayedExpansion
::Делимое
set Num1=16261316608
::Делитель
Set Num2=1024
::Макс. кол-во знаков после запятой в результате
Set MaxZ=2
 
 
set /a Num1_pos=-1
 
:AddNum1
set /a Num1_pos+=1
::если строка закончилась
if "!Num1:~%Num1_pos%,1!"=="" Goto AfterZiro
Set Num1_part=%Num1_part%!Num1:~%Num1_pos%,1!
if %Num1_part%==00 Set Num1_part=0
Call :TryDiv
Goto AddNum1
 
:AfterZiro
if %Num1_part%==0 goto Div_End
if %MaxZ% neq 0 Set ResultAll=%ResultAll%.
Set Zero_Marker=true
 
:AddZiro
Set /A MaxZ-=1
if %MaxZ% LSS 0 Goto Div_End
echo %Num1_part%
if %Num1_part%==0 goto Div_End
Set Num1_part=%Num1_part%0
Call :TryDiv
Goto AddZiro
 
:Div_End
echo %ResultAll%
 
pause
Goto :eof
 
:TryDiv
Set /a Result=Num1_part / Num2
echo %Num1_part%-%result%
if %Result% neq 0 (
  Set ResultAll=%ResultAll%%Result%
  Set /A Num1_part=Num1_part - Result * Num2
) else (if "%ResultAll%" neq "" if not Defined Zero_Marker Set ResultAll=%ResultAll%0)
Exit /B


И для Вас еще пару идей, которые думаю будет интересно реализовать:

1) такой скрипт не требует повышения прав:
Bash
1
2
3
4
5
6
7
8
@echo off
for /f "skip=1 tokens=1-3" %%i in ('2^>nul ^
WMIC LogicalDisk ^
WHERE "DriveType='3'" ^
GET Name^, Size^, FreeSpace') do (
  echo %%i-%%j-%%k
)
pause
Где что, разберетесь. Здесь требуется красивый перевод в гигабайты.
Лучше конечно постепенно делить на 1024 и смотреть сколько цифр остается (соответственно такой префикс и подставлять).

2) такой скрипт тоже требует повышенных прав, но он показывает в единицах, уже сконвертированных к приемлемым величинам:

Алгоритм:
1. Берете предыдущую WMIC, прогоняете каждый том под циклом, подставляя в такой текст
select volume c:
detail volume
select volume d:
detail volume
и т.д. постепенно формируете внешний текстовой файл.
2. Выполняете команду
Bash
1
2
3
diskpart /s имя текстового файла сценария
::Или 
type scenario.txt | diskpart | findstr "Емкость Свободное"
3. Результат парсите по две строки.
Уфф. Вообщем, по-разному можно.
1
denisk37
11 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 10
17.03.2013, 11:25  [ТС] #3
Ну это... Я свой практический интерес удовлетворил.
Пока академические изыскания не прет делать.
Только будет требовать повышенных прав запуска в ОС >= Vista с UAC.
И то пока не упрусь - не озабочусь

Пошел из этих циферок высчитывать %% свободного места

Добавлено через 1 минуту
p.s. Хотя у меня есть один сервер на Win 7 и ещё один намыливается. Пойду на них проверять...

Добавлено через 2 часа 54 минуты
Пока добавил вычисление %% свободного места. Ахтунгование, если меньше 20% и возварат 100 - есои Ок. и %% если нет.
Результат (правда тут не 20%, а 50% для проверки ахтунгов):
Код
 Free space C: 57%. Free 94 Gb of 163 Gb 
 Free space D: 94%. Free 148 Gb of 156 Gb 
 Free space E: 98%. Free 1139 Gb of 1161 Gb 
***ACHTUNG*** Free space F: 35%. Free 295 Gb of 838 Gb
Скрипт:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@echo off
echo.>%0.txt
setlocal enableextensions enabledelayedexpansion
set err=100
for %%j in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
 rem echo %%j
 
  set sFreeSize=0
  set sFreeSizeOf=0
  set /a c=0
  for /f "skip=1 tokens=2 delims=:" %%i in ('fsutil volume diskfree %%j:') do (
    set /a c+=1
    rem echo !c! %%i
    if !c!==1 set sFreeSizeOf=%%i
    if !c!==2 set sFreeSize=%%i
  )
 
  if NOT !sFreeSize!==0 if NOT !sFreeSizeOf!==0 (
    set /A Free=!sFreeSize:~0,-9!
    set /A Size=!sFreeSizeOf:~0,-9!
    set /A Procent=!Free!*100/!Size!
    set ah= 
    if !Procent! LSS 20 (
      set ah=***ACHTUNG*** 
 
      if !Procent! LSS !err! set err=!Procent!
    )
    echo !ah!Free space %%j: !Procent!%%. Free !Free! Gb of !Size! Gb >>%0.txt
  )
 
 
)
 
exit /b !err!
endlocal
Добавлено через 1 минуту
p.s. в нехватку прав администратора уже уперся(
Для работы с программой FSUTIL требуются права администратора
0
Cat2
396 / 81 / 6
Регистрация: 16.02.2013
Сообщений: 327
17.03.2013, 13:20 #4
Цитата Сообщение от Dragokas Посмотреть сообщение
оторые думаю будет интересно реализовать:

1) такой скрипт не требует повышения прав:
Bash
1
2
3
4
5
6
7
8
@echo off
for /f "skip=1 tokens=1-3" %%i in ('2^>nul ^
WMIC LogicalDisk ^
WHERE "DriveType='3'" ^
GET Name^, Size^, FreeSpace') do (
  echo %%i-%%j-%%k
)
pause
Только лучше

WHERE "DriveType='3' AND MediaType='12'"

Что бы не показвало DVD/CD

Так же можно
Description = 'Local Fixed Disk'
1
denisk37
11 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 10
17.03.2013, 14:01  [ТС] #5
Цитата Сообщение от Dragokas Посмотреть сообщение
оторые думаю будет интересно реализовать:

1) такой скрипт не требует повышения прав:
Bash
1
2
3
4
5
6
7
8
@echo off
for /f "skip=1 tokens=1-3" %%i in ('2^>nul ^
WMIC LogicalDisk ^
WHERE "DriveType='3'" ^
GET Name^, Size^, FreeSpace') do (
  echo %%i-%%j-%%k
)
pause
Уболтали чертяки языкастые.
Трансмутировал сккрипт.
Результат:
Bash
1
2
3
4
 Free space C:: 57%. Free 94 Gb of 163 Gb 
 Free space D:: 94%. Free 148 Gb of 156 Gb 
 Free space E:: 98%. Free 1139 Gb of 1161 Gb 
***ACHTUNG*** Free space F:: 34%. Free 288 Gb of 838 Gb
Код:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@echo off
echo.>%0.txt
setlocal enableextensions enabledelayedexpansion
set err=100
 
for /f "skip=1 tokens=1-3" %%i in ('2^>nul ^
WMIC LogicalDisk ^
WHERE "DriveType='3'" ^
GET FreeSpace^, Name^, Size^') do (
 
  set sFreeSize=%%i
  set sFreeSizeOf=%%k
 if NOT 1%%j==1 (
    rem echo %%j %%i %%k
    set /A Free=!sFreeSize:~0,-9!
    set /A Size=!sFreeSizeOf:~0,-9!
    set /A Procent=!Free!*100/!Size!
    set ah= 
    if !Procent! LSS 50 (
      set ah=***ACHTUNG*** 
      if !Procent! LSS !err! set err=!Procent!
    )
    echo !ah!Free space %%j: !Procent!%%. Free !Free! Gb of !Size! Gb >>%0.txt
  )
 
)
type %0.txt
pause
exit /b !err!
endlocal
работает и под Win 7
p.s. CD-Rom-ы в результатах не замечены.
0
Cat2
396 / 81 / 6
Регистрация: 16.02.2013
Сообщений: 327
17.03.2013, 16:54 #6
Цитата Сообщение от denisk37 Посмотреть сообщение
p.s. CD-Rom-ы в результатах не замечены.
Повезло.
На некоторых билдах XP у меня и сидиромы и карридеры юсб показывало при DriveType='3'
0
Dragokas
19.03.2013, 01:49
  #7

Не по теме:

Оффтоп, но про DriveType интересная тема была здесь: Как идентифицировать съемный жесткий диск

0
denisk37
11 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 10
21.03.2013, 19:35  [ТС] #8
Столь приближенный метод округления до мегабайтов скосячил когда места "ввобще нету" =15 Мб.
добавил предварительное присвоение set /A Free=1
Пофиксенный вариант:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@echo off
echo.>%0.txt
setlocal enableextensions enabledelayedexpansion
set err=100
 
for /f "skip=1 tokens=1-3" %%i in ('2^>nul ^
WMIC LogicalDisk ^
WHERE "DriveType='3'" ^
GET FreeSpace^, Name^, Size^') do (
 
  set sFreeSize=%%i
  set sFreeSizeOf=%%k
 if NOT 1%%j==1 (
    echo %%j %%i %%k
    set /A Free=1
    set /A Free=!sFreeSize:~0,-9!
    set /A Size=!sFreeSizeOf:~0,-9!
    set /A Procent=!Free!*100/!Size!
    set ah= 
echo Free=!Free! Size=!Size! Procent=!Procent!
    if !Procent! LSS 20 (
      set ah=***ACHTUNG*** 
      if !Procent! LSS !err! set err=!Procent!
    )
    echo !ah!Free space %%j: !Procent!%%. Free !Free! Gb of !Size! Gb >>%0.txt
  )
 
)
type %0.txt
rem pause
exit /b !err!
endlocal
3
Jeka_Osokin
11 / 11 / 1
Регистрация: 31.08.2012
Сообщений: 110
08.02.2015, 08:31 #9
Пофиксенный вариант:
Добавил модифицированный вариант с вычислением и вычитанием процентов
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
setlocal enableextensions enabledelayedexpansion
for /f "skip=1 tokens=1-3" %%i in ('2^>nul ^
WMIC LogicalDisk ^
WHERE "DriveType='3'" ^
GET FreeSpace^, Name^, Size^') do (
set sFreeSize=%%i
set sFreeSizeOf=%%k
if NOT 1%%j==1 (
set /A Free=1
set /A Size=!sFreeSizeOf:~0,-3!/1024/1024
set /A prc=!Size!/100*3
set /A Size=!Size!-!prc!
set /A Free=!sFreeSize:~0,-3!/1024/1024
set /A prcc=!Free!/100*3
set /A Free=!Free!-!prcc!
set /A Procent=!Free!*100/!Size!
set /A a+=!Size!
set /A al+=!free!
set /A all+=!Procent!
echo Свободно %%j !Procent!%%. !Free! Гб из !Size! Гб
))
echo Всего %a% Гб, свободно %al% Гб (%all%%%)
pause >nul
exit
Ещё бы знать как названия добавить и если его нет то просто писать "Логический диск", пробовал но так и не получилось
0
sov44
1758 / 742 / 128
Регистрация: 09.04.2011
Сообщений: 1,313
08.02.2015, 10:30 #10
Jeka_Osokin, добавьте в 6 строку Description
0
Jeka_Osokin
11 / 11 / 1
Регистрация: 31.08.2012
Сообщений: 110
11.02.2015, 19:08 #11
Я уж сколько добавлял всякого, а он всё не так показывает, то коряги вместо русского, то одна фраза там другая тут
0
Zhenyok7
0 / 0 / 0
Регистрация: 13.11.2015
Сообщений: 5
09.06.2018, 14:37 #12
Привет всем! как доработать скрипт denisk37 чтобы при "ахтунге" запускался ещё и батник который отправит на мыло сообщение?
0
kozidub21
27 / 27 / 8
Регистрация: 16.01.2018
Сообщений: 80
09.06.2018, 17:57 #13
denisk37,
Небольшой «мониторчик»

Метка cal, что значит calculator, за идею спасибо Dragokas.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@echo off
chcp 65001 >nul& color f9
setlocal enableextensions enabledelayedexpansion
if "%~1"=="" (echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"1","","runas",1 >"%~dp0Arun.vbs"& cscript //nologo "%~dp0Arun.vbs" "%~f0"& del /f /q "Arun.vbs"& exit)
echo Copyright © Китаец228& timeout 2 /nobreak >nul
:ag
set a=0
for %%h in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (call :chk "%%h")
cls
for /l %%h in (1,1,!a!) do (echo !a%%h!)
choice /c x /n /t 5 /d x >nul
goto ag
:chk
set tm=0& set b=0& set c=0
for /f "usebackq tokens=2 delims=:" %%h in (`fsutil volume diskfree %~1:\`) do (set wok=%%h
if not "!wok:~0,2!"=="  " (if "!tm!"=="0" (set tm=1& set b=!wok:~1!) else (set tm=0& set c=!wok:~1!)))
if not "!b!"=="0" (if not "!c!"=="0" (call :cal "((!b!/1024)/1024)/1024" "b"& call :cal "((!c!/1024)/1024)/1024" "c"
set db=!b:,=.!& set dc=!c:,=.!& call :cal "(100*!db!)/!dc!" "prb"& call :remzn "prb"& call :remzn "b"& call :remzn "c"
set /a a+=1& set a!a!=Disk %~1: Free !b! Gb ^(!prb! %%%^) of !c! Gb))
exit /b
:cal
echo res=Eval("%~1")>sh& echo WScript.Echo res>>sh
for /f "usebackq tokens=*" %%h in (`cscript /nologo /e:vbscript "sh"`) do (set %~2=%%h)
del /f /q "sh"
exit /b
:remzn
set remznsh=3
set wok=!%~1!
:remznag
if "!wok:~0,1!"=="," (set wok=!%~1!& set %~1=!wok:~0,%remznsh%!& exit /b) else (set wok=!wok:~1!& set /a remznsh+=1)
goto remznag
0
Миниатюры
Проверка свободного места на диске в cmd  
Dragokas
13.06.2018, 05:10
  #14

Не по теме:

Используя VBScript (2 раза), можно и всю математику, и получение данных о дисках написать на нём же за один вызов.

0
Zhenyok7
0 / 0 / 0
Регистрация: 13.11.2015
Сообщений: 5
10.07.2018, 19:38 #15
Ну так что никто не поможет с батничком?
0
alpap
1387 / 1118 / 362
Регистрация: 26.04.2015
Сообщений: 3,983
10.07.2018, 23:40 #16
Zhenyok7,
если проблема отправить на почту:
(проверялось в кодировке 866)
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nircmd win hide title "%comspec%"
@echo off
set "mailsender=ПУТЬ\mailsend1.19.exe"
set "smtpserver=smtp.gmail.com"
set "smtpport=465"
set "smtpuser=ЛОГИН ОТ КОГО@gmail.com"
set "smtppwd=ПАРОЛЬ ПОЧТЫ"
set "smtpsender=ЛОГИН КОМУ@gmail.com" 
set "subject=ЗАГОЛОВОК ПИСЬМА"
set "body=СООБЩЕНИЕ В ТЕЛЕ ПИСЬМА"
 
"%mailsender%" ^
+cc +bc -q ^
-user "%smtpuser%" ^
-pass "%smtppwd%" ^
-t "%smtpuser%" ^
-f "%smtpsender%" ^
-auth -smtp "%smtpserver%" ^
-ssl -port "%smtpport%" ^
-sub "%subject%" ^
-M "%body%"
exit
сопутствующие файлы:
MAILTO.7z
1
alpap
1387 / 1118 / 362
Регистрация: 26.04.2015
Сообщений: 3,983
10.07.2018, 23:52 #17
для кодировки 1251
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nircmd win hide title "%comspec%"
@echo off
>nul chcp 1251
set "mailsender=ПУТЬ\mailsend1.19.exe"
set "smtpserver=smtp.gmail.com"
set "smtpport=465"
set "smtpuser=ЛОГИН ОТ КОГО@gmail.com"
set "smtppwd=ПАРОЛЬ ПОЧТЫ"
set "smtpsender=ЛОГИН КОМУ@gmail.com" 
set "subject=ЗАГОЛОВОК ПИСЬМА"
set "body=СООБЩЕНИЕ В ТЕЛЕ ПИСЬМА"
 
"%mailsender%" ^
-cs 1251 +cc +bc -q ^
-user "%smtpuser%" ^
-pass "%smtppwd%" ^
-t "%smtpuser%" ^
-f "%smtpsender%" ^
-auth -smtp "%smtpserver%" ^
-ssl -port "%smtpport%" ^
-sub "%subject%" ^
-M "%body%"
exit
0
10.07.2018, 23:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2018, 23:52

Проверка скрипта в cmd
Не работает perl. Может кто проверит работает ли данный скрипт и сделайте ,...

Проверка связи с интернетом - CMD/BAT
Помогите пожалуйста. Долго читал искал всяко разно информацию , в итоге пришел...

Проверка наличия файла на диске
Всем привет Ребят , у меня батник , который ищет указанный файл на диске, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru