[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已解决]批处理怎样用 fsutil/wmic 计算系统盘已用空间?

本帖最后由 aries215 于 2019-1-8 05:43 编辑

我自己找到更可靠的方法,准确,兼容:
http://www.bathome.net/thread-51804-1-1.html
==================================
  1. fsutil volume diskfree c:
复制代码
剩余空间和总空间怎么分别获取?

先前请教了wmic的取值方法,现在想改用简便的fsutil。
谢谢大家热心帮助!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 1410029385 于 2018-5-5 08:44 编辑
  1. $source = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("dXNpbmcgU3lzdGVtO3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcztwdWJsaWMgY2xhc3MgS2VybmVsMzJ7W0RsbEltcG9ydCgiS2VybmVsMzIuZGxsIildcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHZvaWQgR2V0U3lzdGVtRGlyZWN0b3J5KGJ5dGVbXSBieXRlcywgaW50IGxlbmd0aCk7W0RsbEltcG9ydCgiS2VybmVsMzIuZGxsIildcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGJvb2wgR2V0RGlza0ZyZWVTcGFjZUV4KHN0cmluZyBwYXRoLCBvdXQgdWxvbmcgbHB1c2UsIG91dCB1bG9uZyBscHRvdGFsLCBvdXQgdWxvbmcgbHBmcmVlKTtwdWJsaWMgc3RhdGljIHVsb25nW10gQ2hlY2tTeXN0ZW1EaXNrRnJlZVNwYWNlKCl7Ynl0ZVtdIHN5c0RpciA9IG5ldyBieXRlWzEyOF07R2V0U3lzdGVtRGlyZWN0b3J5KHN5c0RpciwgMTI4KTtzdHJpbmcgUGF0aCA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkRlZmF1bHQuR2V0U3RyaW5nKHN5c0RpcikuVHJpbUVuZCgnXDAnKS5TdWJzdHJpbmcoMCwgMyk7dWxvbmcgbHB1c2U7dWxvbmcgbHB0b3RhbDt1bG9uZyBscGZyZWU7R2V0RGlza0ZyZWVTcGFjZUV4KFBhdGgsIG91dCBscHVzZSwgb3V0IGxwdG90YWwsIG91dCBscGZyZWUpO3JldHVybiBuZXdbXSB7IGxwdXNlLCBscHRvdGFsLCBscGZyZWUgfTt9fV=="))
  2. Add-Type $source
  3. $space = [Kernel32]::CheckSystemDiskFreeSpace()
  4. $space = [System.Convert]::ToUInt64(($space[1] - $space[2])/1048576)
  5. Write-Host 系统盘已用空间 $space MB
复制代码

TOP

本帖最后由 aries215 于 2018-5-5 09:13 编辑

回复 2# 1410029385
我要纯批处理哦,否则有些环境执行不了。
谢谢!为啥要转Base64?

TOP

本帖最后由 tigerpower 于 2018-5-5 19:29 编辑

纯批,误差在2MB以内:
  1. @echo off
  2. for /f "tokens=2,3" %%i in ('wmic logicaldisk C: get size^,freespace^,caption^|findstr C:') do @set a=%%i&set b=%%j
  3. set /a s=(%b:~0,-3%-%a:~0,-3%)/1024*1000/1024
  4. echo %s%MB
复制代码
要精确值使用powershell:
  1. powershell -c "$c=Get-WmiObject Win32_LogicalDisk -Filter \"DeviceID='C:'\";\"{0:F2}MB\" -f (($c.Size-$c.FreeSpace)/1mb)"
复制代码

TOP

本帖最后由 aries215 于 2018-5-6 19:29 编辑

回复 4# tigerpower
谢谢!但闪退。
Powershell 不是每台电脑都有。结果正确,速度太慢。

TOP

本帖最后由 tigerpower 于 2018-5-5 19:28 编辑

回复 5# aries215

纯批的代码已改,误差在2MB以内,如果在意这点误差,可以搜一下论坛里“大数”和“浮点数”的帖子。
Powershell第一次运行是比较慢,之后和纯批的速度差距不超过1秒。

TOP

本帖最后由 aries215 于 2018-5-6 19:29 编辑

回复 6# tigerpower
结果正确!
再次感谢!

TOP





用nim写了一个,表示很开心:
  1. type
  2.     WINBOOL* = uint32
  3.     s64* = uint64
  4. proc  getDiskFreeSpaceEx*(name: cstring, freeBytes,
  5.     lpTotalNumberOfBytes,lpTotalNumberOfFreeBytes: var s64): WINBOOL
  6.     {.stdcall, dynlib: "kernel32", importc: "GetDiskFreeSpaceExA", discardable.}
  7. proc getusedspace*(name: cstring):auto {.discardable.} =
  8.     var freeBytes, totalBytes, totalFreeBytes: s64
  9.     getDiskFreeSpaceEx(name, freeBytes, totalBytes,totalFreeBytes)
  10.     result = ((totalBytes - freeBytes) div 1024 div 1024)
  11. echo "已经使用:", getusedspace("c:\\EFI"), "MB"
复制代码
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 8# codegay
谢谢,虽然看不懂

TOP

发现一个更简单的
  1. powershell -c (gdr C).Used/1mb
复制代码
2

评分人数

TOP

顶起,有新问题!

TOP

回复 4# tigerpower
拜托!
1楼有新问题!

TOP

本帖最后由 523066680 于 2019-1-5 20:27 编辑

回复 1# aries215


    你想要第一列和最后一列是吗?
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. for /f "tokens=1,3" %%i in ('fsutil volume diskfree c:') do (
  4.     set "a=%%i"
  5.     set "b=%%j"
  6.     echo !a! - !b!
  7. )
复制代码
蛋疼一点:
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. :: 常量初始化
  4. set sharp=####################
  5. :get_total_size
  6. for /f "tokens=3" %%i in ('fsutil volume diskfree c:') do (set total=%%i&goto :get_free_size)
  7. :get_free_size
  8. for /f "tokens=3" %%i in ('fsutil volume diskfree c: ^|more +1') do (set free=%%i&goto :count)
  9. :count
  10. call :bignum_minus %total% %free% delta
  11. echo %total% %free% 已用空间 %delta%
  12. exit /b
  13. ::大数减法
  14. :bignum_minus
  15.     setlocal
  16.     set num_a=%1
  17.     set num_b=%2
  18.     call :length %num_a% len_a
  19.     call :length %num_b% len_b
  20.     set /a max = len_a
  21.     if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
  22.     set /a minus = 0
  23.     for /l %%n in ( 1, 1, %max% ) do (
  24.         if %%n leq %len_b% (
  25.             set /a dt = !num_a:~-%%n,1! - !num_b:~-%%n,1! - minus
  26.         ) else (
  27.             set /a dt = !num_a:~-%%n,1! - minus
  28.         )
  29.         if !dt! lss 0 (
  30.             set /a buff[%%n] = dt + 10, minus=1
  31.         ) else (
  32.             set /a buff[%%n] = dt, minus=0
  33.         )
  34.     )
  35.     set delta=#
  36.     for /l %%a in (%max%, -1, 1) do set delta=!delta:#0=#!!buff[%%a]!
  37.     endlocal &set %3=%delta:#=%
  38.     goto :eof
  39. ::字符串长度计算
  40. :length %str% %vname%
  41.     setlocal
  42.     set test=%~1_%sharp%
  43.     set test=!test:~0,20!
  44.     set test=%test:*_=%
  45.     set /a len=20-(%test:#=1+%1)
  46.     endlocal &set %2=%len%
  47.     goto :eof
复制代码
如果你要我转换成 KB MB GB ,对不起,我不会批处理,我是论坛消遣区负责灌水的。

TOP

本帖最后由 aries215 于 2019-1-5 20:48 编辑

回复 13# 523066680
我要的是总空间和剩余空间,分别赋值,要相减得出系统占用大小。
谢谢

TOP

回复 14# aries215
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. for /f "tokens=1,3" %%i in ('fsutil volume diskfree c:') do (
  4.     if "%%i" equ "可用字节总数" (
  5.         set "free=%%j"
  6.     ) else if "%%i" equ "字节总数" (
  7.         set "total=%%j"
  8.     )
  9. )
  10. echo !free!
  11. echo !total!
  12. pause
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表