Использование wmic для получения информации о дисковом пространстве

Я пытаюсь получить информацию о физических дисках на компьютере с помощью wmic, чтобы получить что-то вроде этого:

Drive C:
500 GB Total
100 GB Free
20% Free

Drive D:
500 GB Total
100 GB Free
20% Free

Мой код до сих пор:

for /f "usebackq tokens=*" %%a in (`wmic logicaldisk where "drivetype=3" get caption`) do (
echo "Drive=%%a"
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where DeviceID='%%a'"       
get FreeSpace /format:value`) do set FreeSpace=%%x
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='%%a'" get Size /format:value`) do set Size=%%x
echo FreeMB=%FreeSpace%
echo SizeMB=%Size%
set /a Percentage=100 * %FreeSpace% / %Size%
echo %%a is %Percentage% %% free
)

И мой вывод:

"Drive=Caption
No Instance(s) Available.
No Instance(s) Available.
FreeMB=9193357312
SizeMB=80024170496
Invalid number.  Numbers are limited to 32-bits of precision.
 is  % free
"Drive=C:
No Instance(s) Available.
No Instance(s) Available.
FreeMB=9193357312
SizeMB=80024170496
Invalid number.  Numbers are limited to 32-bits of precision.
is  % free
"Drive=E:
No Instance(s) Available.
No Instance(s) Available.
FreeMB=9193357312
SizeMB=80024170496
Invalid number.  Numbers are limited to 32-bits of precision.
 is  % free
"Drive=
No Instance(s) Available.
No Instance(s) Available.
FreeMB=9193357312
SizeMB=80024170496
Invalid number.  Numbers are limited to 32-bits of precision.
 is  % free

Я добираюсь до многих строк, у которых даже нет диска, и я не могу отформатировать значение, поэтому я могу рассчитать процент или показать значения в обычном формате.


person Pedro Sales    schedule 15.07.2014    source источник


Ответы (3)


Это может сработать для вас: код должен быть добавлен в конец вашего пакетного файла и использовать

call :hdd-info

в вашем коде для отображения данных.

goto :eof
:code by aGerman - display drive stats and bar graph (REMmed out)
:hdd-info    
@echo off &setlocal
set "GB=1073741824"
for /f "skip=1 delims=" %%i in ('wmic logicaldisk get DeviceID^,FreeSpace^,Size') do (
  for /f "tokens=1-3" %%j in ("%%i") do call :output %%j %%k %%l
)
goto :eof
:output
if "%3"=="" (
  rem echo Unable to discover the drive properties.
  goto :eof
)
for /f "tokens=1-4" %%i in (
  'mshta vbscript:Execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(FormatNumber(%3/%GB%, 2) & "" "" & FormatNumber((%3-%2)/%GB%, 2) & "" "" & FormatNumber(%2/%GB%, 2) & "" "" & Round((%3-%2)*50/%3)):Close"^)'
) do (
  set "size=      %%i"
  set "used=      %%j"
  set "free=      %%k"
  set /a "nUsed=%%l, nFree=50-%%l"
)
echo(
echo       %1
echo Size: %size:~-10% GB
echo Used: %used:~-10% GB
echo Free: %free:~-10% GB
:: echo(
:: for /l %%i in (1 1 %nUsed%) do <nul set /p "=▒"
:: for /l %%i in (1 1 %nFree%) do <nul set /p "=█"
:: echo(&echo(&echo(
goto :eof
person foxidrive    schedule 15.07.2014
comment
Это просто идеально! Спасибо - person Pedro Sales; 15.07.2014
comment
Еще один вопрос, если можно... Эта информация о дисках уже находится внутри цикла for для получения другой информации... и когда я выполняю ваш код, он терпит неудачу, вероятно, из-за команды вызова. Есть ли способ сделать все это вместе без звонка? - person Pedro Sales; 15.07.2014
comment
Вы хотите информацию в текстовом файле? Точный способ использования кода определит наилучший способ его применения. - person foxidrive; 15.07.2014
comment
Нет, я хочу информацию на экране - person Pedro Sales; 16.07.2014
comment
Я добавил метку в приведенный выше код — поместите весь код в самый низ вашего пакетного сценария и используйте call :hdd-info в своем коде для отображения информации. - person foxidrive; 16.07.2014

Как сообщает вам сообщение об ошибке, set ограничен 32-битными целыми числами. Если вы можете жить с точностью MB, вы можете сократить числа следующим образом:

set SizeMB=%size:~0,-6%

(он принимает строку, кроме последних 6 символов)

Это может быть не совсем правильно в математическом смысле, но должно быть достаточно хорошим.

Конечно, вам придется сократить %freeMB% таким же образом.

person Stephan    schedule 15.07.2014
comment
изменил код, чтобы установить SizeMB=%size:~0,-6% echo %Size% set FreeMB=%FreeSpace:~0,-6% echo %FreeMB% set /a Percentage=100 * %FreeMB% / %SizeMB% echo %%a %Percentage% %% свободен, но все еще получаю это: Диск = C: нет доступных экземпляров. Нет доступных экземпляров. 80024170496 91933 % свободен - person Pedro Sales; 15.07.2014

person    schedule
comment
также добавьте некоторые пояснения. - person Vinay Prajapati; 21.04.2018
comment
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную немедленную помощь. Надлежащее объяснение значительно повысило бы его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими подобными вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения, включая сделанные вами предположения. - person Maximilian Peters; 22.04.2018