Board logo

标题: [其他] [分享]批处理显示硬盘及分区容量,转换成GB或MB [打印本页]

作者: apang    时间: 2014-5-27 07:55     标题: [分享]批处理显示硬盘及分区容量,转换成GB或MB

本帖最后由 apang 于 2015-1-8 10:12 编辑

在度兽某吧回复一网友时写的,稍作修改,搬运过来。
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=g" %%a in ('cmd /u /cEcho,有') do set "Tab=%%a"
  3. set w=wmic diskdrive where "MediaType like 'fixed%%'"
  4. (for /f "delims=" %%a in ('%w% get model^,size/value^|find "="') do (
  5.     for /f "tokens=1,2delims==" %%b in ("%%a") do (
  6.         if /i "%%b" == "model" (
  7.             set "model=%%~nxc" & set /a i+=1
  8.             set /p=硬盘!i!:%Tab%<nul
  9.         ) else (
  10.             call :GetSize %%~nxc000 size
  11.             if !size! gtr 102400 (
  12.                 set /a size/=1024 & set "G=GB"
  13.             ) else set "G=MB"
  14.             set /p=大小: !size:~,-2!.!size:~-2!!G!%Tab%<nul
  15.             set /p=型号: !model!<nul
  16.             echo,
  17.         )
  18.     )
  19. ))>DiskInfo.txt
  20. set w=wmic logicaldisk where "DriveType='3'"
  21. for /f "tokens=1-3" %%a in ('%w% get freespace^,name^,size^|find ":"')do (
  22.     set /p=分区%%b%Tab%<nul
  23.     call :GetSize %%a000 free
  24.     call :GetSize %%c000 size
  25.     set /a used=size-free
  26.     if !size! gtr 102400 (
  27.         set "G=GB" & set /a size/=1024,used/=1024
  28.     ) else set "G=MB"
  29.     set /a used=1000*used/size
  30.     if "!used:~,-1!" == "" set "used=0!used!"
  31.     set /p=大小: !size:~,-2!.!size:~-2!!G!%Tab%<nul
  32.     if !free! gtr 102400 (set /a free/=1024 & set "G=GB") else set "G=MB"
  33.     set /p=剩余: !free:~,-2!.!free:~-2!!G!%Tab%<nul
  34.     set /p=使用率: !used:~,-1!.!used:~-1!%%<nul
  35.     echo,
  36. )>>DiskInfo.txt
  37. start "" NotePad DiskInfo.txt
  38. exit/b
  39. :GetSize
  40. set "num=%1" & set "n=" & set "%2="
  41. for %%a in (16 8 4 2 1) do (
  42.     if not "!num:~%%a!"=="" set /a n+=%%a & set "num=!num:~%%a!"
  43. )
  44. set "num=%1" & set /a n-=6
  45. for /l %%a in (!n! -1 1) do (
  46.     set "s=!num:~,-%%a!"
  47.     if "!s:~,1!" == "0" set "s=!s:~1!"
  48.     set /a m=s%%1048576,s/=1048576
  49.     set "%2=!%2!!s!"
  50.     set "num=!m!!num:~-%%a!"
  51. )
  52. if not defined %2 (
  53.     set "%2=!num:~,-1!"
  54. ) else if "!%2:~,1!" == "0" set "%2=!%2:~1!"
复制代码
改一下,还是保存到文件吧
作者: zhanglei1371    时间: 2014-5-27 12:03

感谢分享,学习下
作者: gannh    时间: 2014-5-30 16:56

厉害厉害,谢谢分享
作者: ygqiang    时间: 2014-12-16 07:08

回复 1# apang

如果有2个硬盘,显示结果有点别扭。




    能否分开显示呢?比如显示结果如下:
——————硬盘1:
分区c:
分区d:
——————硬盘2:
分区e:
分区f:

。。。。。
作者: apang    时间: 2014-12-16 20:54

本帖最后由 apang 于 2015-1-8 09:58 编辑

回复 4# ygqiang


    把硬盘与分区关系对应起来,试了一下 WMIC 的 ASSOC,但搞之不定。如果确有此需要,可以试试 vbs
  1. Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  2. Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  3. For Each objDisk in colDisks
  4.     i = i + 1
  5.     s = s & "硬盘" & i & ":" & vbTab
  6.     s = s & "大小:" & GetSize(objDisk.Size) & vbTab
  7.     s = s & "型号:" & objDisk.Caption & vbCrLf
  8.     strDiskID = Replace(objDisk.DeviceID, "\", "\\")
  9.     Set colPartitions = objWMI.ExecQuery _
  10.     ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
  11.     & " where AssocClass=Win32_DiskDriveToDiskPartition")
  12.     For Each objPartition in colPartitions
  13.         strPartId = objPartition.DeviceID
  14.         Set colLogicalDisks = objWMI.ExecQuery _
  15.         ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId & """} where AssocClass=Win32_LogicalDiskToPartition")
  16.         For Each objLogicalDisk in colLogicalDisks
  17.             size = objLogicalDisk.Size
  18.             free = objLogicalDisk.Freespace
  19.             used = FormatNumber((size - free) / size * 100, 2, true) & "%"
  20.             s = s & "分区" & objLogicalDisk.DeviceID & vbTab
  21.             s = s & "大小:" & GetSize(size) & vbTab
  22.             s = s & "剩余:" & GetSize(free) & vbTab
  23.             s = s & "使用率:" & used & vbCrLf
  24.         Next
  25.     Next
  26.     s = s & vbCrLf
  27. Next
  28. Set fso = CreateObject("Scripting.FileSystemObject")
  29. fso.OpenTextFile("Result.txt", 2, true).Write s
  30. CreateObject("WScript.Shell").Run "NotePad Result.txt"
  31. Function GetSize(intSize)
  32.     If intSize/1024/1024 > 1024 Then
  33.         GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  34.     Else
  35.         GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  36.     End If
  37. End Function
复制代码
vbs有一处笔误,修改下。
顺带加一个bat,不过效率不咋地
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=g" %%a in ('cmd /u /cEcho,有') do set "Tab=%%a"
  3. set w=wmic diskdrive where "MediaType like 'fixed%%'"
  4. set "w=%w% get DeviceID^,Model^,Size"
  5. for /f "tokens=1*delims==" %%i in ('%w% /value ^| find "="') do (
  6.     if /i "%%i" == "DeviceID" set /a n+=1
  7.     set "%%i!n!=%%j"
  8. )
  9. set "w1=wmic path Win32_DiskDriveToDiskPartition get Antecedent^,Dependent"
  10. set "w2=wmic path Win32_LogicalDiskToPartition get Antecedent^,Dependent"
  11. (for /l %%i in (1 1 !n!) do (
  12.     call :GetSize !Size%%i!000 size
  13.     if !size! gtr 102400 (set /a size/=1024 & set "G=GB") else set "G=MB"
  14.     set /p=硬盘%%i:%Tab%<nul
  15.     set /p=大小:!size:~,-2!.!size:~-2!!G!%Tab%<nul
  16.     set /p=型号:!Model%%i!<nul
  17.     echo,
  18.     for /f tokens^=4delims^=^" %%a in ('%w1% ^| find /i """!DeviceID%%i!"""') do (
  19.         for /f tokens^=4delims^=^" %%b in ('%w2%^|find /i """%%a"""') do (
  20.             set "w3=wmic logicaldisk where "Name='%%b'" get FreeSpace^,Size"
  21.             for /f "tokens=1,2" %%c in ('!w3!^|findstr [0-9]') do (
  22.                 call :GetSize %%c000 free
  23.                 call :GetSize %%d000 size
  24.                 set /a used=size-free
  25.                 if !size! gtr 102400 (
  26.                     set /a size/=1024,used/=1024 & set "G=GB"
  27.                 ) else set "G=MB"
  28.                 set /a used=1000*used/size
  29.                 if "!used:~,-1!" == "" set "used=0!used!"
  30.                 set /p=分区%%b%Tab%<nul
  31.                 set /p=大小:!size:~,-2!.!size:~-2!!G!%Tab%<nul
  32.                 if !free! gtr 102400 (
  33.                     set /a free/=1024 & set "G=GB"
  34.                 ) else set "G=MB"
  35.                 set /p=剩余:!free:~,-2!.!free:~-2!!G!%Tab%<nul
  36.                 set /p=使用率:!used:~,-1!.!used:~-1!%%<nul
  37.                 echo,
  38.             )
  39.         )
  40.     )
  41.     echo,
  42. ))>Result.txt
  43. start "" NotePad Result.txt
  44. pause & exit/b
  45. :GetSize
  46. set "num=%1" & set "n=" & set "%2="
  47. for %%a in (16 8 4 2 1) do (
  48.     if not "!num:~%%a!"=="" set /a n+=%%a & set "num=!num:~%%a!"
  49. )
  50. set "num=%1" & set /a n-=6
  51. for /l %%a in (!n! -1 1) do (
  52.     set "s=!num:~,-%%a!"
  53.     if "!s:~,1!" == "0" set "s=!s:~1!"
  54.     set /a m=s%%1048576,s/=1048576
  55.     set "%2=!%2!!s!"
  56.     set "num=!m!!num:~-%%a!"
  57. )
  58. if not defined %2 (
  59.     set "%2=!num:~,-1!"
  60. ) else if "!%2:~,1!" == "0" set "%2=!%2:~1!"
复制代码

作者: ygqiang    时间: 2015-1-8 10:54

回复  ygqiang


    把硬盘与分区关系对应起来,试了一下 WMIC 的 ASSOC,但搞之不定。如果确有此需要 ...
apang 发表于 2014-12-16 20:54



    解决了。谢谢。

http://www.bathome.net/thread-33606-1-1.html
作者: shelluserwlb    时间: 2015-1-9 00:39

本帖最后由 shelluserwlb 于 2015-1-9 08:19 编辑

确实是高手。
作者: yiwuyun    时间: 2015-1-10 12:21

用diskpart 应该可以摆脱wmic在WINPE下不能用的限制。
作者: apang    时间: 2015-1-10 16:13

回复 8# yiwuyun


    diskpart 不能算剩余容量和使用率
不同的WinPE精简程度不一样,有些外部命令(如find和findstr)不是每个WinPE都有,纯P估计不好办
作者: yiwuyun    时间: 2015-1-10 18:31

dir和diskpart结合起来就可以。当然如果没有find或findstr就不好办了。
作者: freesoft00    时间: 2015-5-28 12:52

回复 5# apang


    http://www.bathome.net/redirect. ... 5&fromuid=11423
这个批处理如何整合到你的这个批处理中
先列出来各分区大小及剩余空间,并列出来和批处理同目录的文件和子文件夹中的总共体积,大小最好能设置为你的代码中一样的效果,小于多少就显示MB,多余多少就设置为GB为单位
然后让用户输入一个要复制的分区盘符,
之后拿这个分区的剩余空间和要复制的文件的总体积做比较,如果大于就复制过去,如果空间小于就提示用户从新选择一个盘符。
作者: zhiwen    时间: 2019-8-2 23:50

感谢楼主的辛勤付出,,但是有一个要求,就是遇到U盘,你的批处理没有显示到U盘的容量相关信息
作者: Batcher    时间: 2019-8-3 09:06

回复 12# zhiwen


插上U盘,执行命令:
wmic diskdrive get serialnumber,mediatype,model /value

再看看楼主第3行的过滤条件,就明白为啥了。
作者: cc5511    时间: 2020-8-29 02:34

回复 5# apang


    学习了 谢谢你的分享




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2