标题: [其他] [分享]批处理显示硬盘及分区容量,转换成GB或MB [打印本页]
作者: apang 时间: 2014-5-27 07:55 标题: [分享]批处理显示硬盘及分区容量,转换成GB或MB
本帖最后由 apang 于 2015-1-8 10:12 编辑
在度兽某吧回复一网友时写的,稍作修改,搬运过来。- @echo off & setlocal enabledelayedexpansion
- for /f "delims=g" %%a in ('cmd /u /cEcho,有') do set "Tab=%%a"
- set w=wmic diskdrive where "MediaType like 'fixed%%'"
- (for /f "delims=" %%a in ('%w% get model^,size/value^|find "="') do (
- for /f "tokens=1,2delims==" %%b in ("%%a") do (
- if /i "%%b" == "model" (
- set "model=%%~nxc" & set /a i+=1
- set /p=硬盘!i!:%Tab%<nul
- ) else (
- call :GetSize %%~nxc000 size
- if !size! gtr 102400 (
- set /a size/=1024 & set "G=GB"
- ) else set "G=MB"
- set /p=大小: !size:~,-2!.!size:~-2!!G!%Tab%<nul
- set /p=型号: !model!<nul
- echo,
- )
- )
- ))>DiskInfo.txt
-
- set w=wmic logicaldisk where "DriveType='3'"
- for /f "tokens=1-3" %%a in ('%w% get freespace^,name^,size^|find ":"')do (
- set /p=分区%%b%Tab%<nul
- call :GetSize %%a000 free
- call :GetSize %%c000 size
- set /a used=size-free
- if !size! gtr 102400 (
- set "G=GB" & set /a size/=1024,used/=1024
- ) else set "G=MB"
- set /a used=1000*used/size
- if "!used:~,-1!" == "" set "used=0!used!"
- set /p=大小: !size:~,-2!.!size:~-2!!G!%Tab%<nul
- if !free! gtr 102400 (set /a free/=1024 & set "G=GB") else set "G=MB"
- set /p=剩余: !free:~,-2!.!free:~-2!!G!%Tab%<nul
- set /p=使用率: !used:~,-1!.!used:~-1!%%<nul
- echo,
- )>>DiskInfo.txt
- start "" NotePad DiskInfo.txt
- exit/b
-
- :GetSize
- set "num=%1" & set "n=" & set "%2="
- for %%a in (16 8 4 2 1) do (
- if not "!num:~%%a!"=="" set /a n+=%%a & set "num=!num:~%%a!"
- )
- set "num=%1" & set /a n-=6
- for /l %%a in (!n! -1 1) do (
- set "s=!num:~,-%%a!"
- if "!s:~,1!" == "0" set "s=!s:~1!"
- set /a m=s%%1048576,s/=1048576
- set "%2=!%2!!s!"
- set "num=!m!!num:~-%%a!"
- )
- if not defined %2 (
- set "%2=!num:~,-1!"
- ) 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- Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
- Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
-
- For Each objDisk in colDisks
- i = i + 1
- s = s & "硬盘" & i & ":" & vbTab
- s = s & "大小:" & GetSize(objDisk.Size) & vbTab
- s = s & "型号:" & objDisk.Caption & vbCrLf
- strDiskID = Replace(objDisk.DeviceID, "\", "\\")
-
- Set colPartitions = objWMI.ExecQuery _
- ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
- & " where AssocClass=Win32_DiskDriveToDiskPartition")
-
- For Each objPartition in colPartitions
- strPartId = objPartition.DeviceID
-
- Set colLogicalDisks = objWMI.ExecQuery _
- ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId & """} where AssocClass=Win32_LogicalDiskToPartition")
-
- For Each objLogicalDisk in colLogicalDisks
- size = objLogicalDisk.Size
- free = objLogicalDisk.Freespace
- used = FormatNumber((size - free) / size * 100, 2, true) & "%"
- s = s & "分区" & objLogicalDisk.DeviceID & vbTab
- s = s & "大小:" & GetSize(size) & vbTab
- s = s & "剩余:" & GetSize(free) & vbTab
- s = s & "使用率:" & used & vbCrLf
- Next
- Next
- s = s & vbCrLf
- Next
-
- Set fso = CreateObject("Scripting.FileSystemObject")
- fso.OpenTextFile("Result.txt", 2, true).Write s
- CreateObject("WScript.Shell").Run "NotePad Result.txt"
-
- Function GetSize(intSize)
- If intSize/1024/1024 > 1024 Then
- GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
- Else
- GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
- End If
- End Function
复制代码
vbs有一处笔误,修改下。
顺带加一个bat,不过效率不咋地- @echo off & setlocal enabledelayedexpansion
- for /f "delims=g" %%a in ('cmd /u /cEcho,有') do set "Tab=%%a"
- set w=wmic diskdrive where "MediaType like 'fixed%%'"
- set "w=%w% get DeviceID^,Model^,Size"
-
- for /f "tokens=1*delims==" %%i in ('%w% /value ^| find "="') do (
- if /i "%%i" == "DeviceID" set /a n+=1
- set "%%i!n!=%%j"
- )
-
- set "w1=wmic path Win32_DiskDriveToDiskPartition get Antecedent^,Dependent"
- set "w2=wmic path Win32_LogicalDiskToPartition get Antecedent^,Dependent"
- (for /l %%i in (1 1 !n!) do (
- call :GetSize !Size%%i!000 size
- if !size! gtr 102400 (set /a size/=1024 & set "G=GB") else set "G=MB"
- set /p=硬盘%%i:%Tab%<nul
- set /p=大小:!size:~,-2!.!size:~-2!!G!%Tab%<nul
- set /p=型号:!Model%%i!<nul
- echo,
-
- for /f tokens^=4delims^=^" %%a in ('%w1% ^| find /i """!DeviceID%%i!"""') do (
- for /f tokens^=4delims^=^" %%b in ('%w2%^|find /i """%%a"""') do (
- set "w3=wmic logicaldisk where "Name='%%b'" get FreeSpace^,Size"
- for /f "tokens=1,2" %%c in ('!w3!^|findstr [0-9]') do (
- call :GetSize %%c000 free
- call :GetSize %%d000 size
- set /a used=size-free
- if !size! gtr 102400 (
- set /a size/=1024,used/=1024 & set "G=GB"
- ) else set "G=MB"
- set /a used=1000*used/size
- if "!used:~,-1!" == "" set "used=0!used!"
- set /p=分区%%b%Tab%<nul
- set /p=大小:!size:~,-2!.!size:~-2!!G!%Tab%<nul
- if !free! gtr 102400 (
- set /a free/=1024 & set "G=GB"
- ) else set "G=MB"
- set /p=剩余:!free:~,-2!.!free:~-2!!G!%Tab%<nul
- set /p=使用率:!used:~,-1!.!used:~-1!%%<nul
- echo,
- )
- )
- )
- echo,
- ))>Result.txt
- start "" NotePad Result.txt
- pause & exit/b
-
- :GetSize
- set "num=%1" & set "n=" & set "%2="
- for %%a in (16 8 4 2 1) do (
- if not "!num:~%%a!"=="" set /a n+=%%a & set "num=!num:~%%a!"
- )
- set "num=%1" & set /a n-=6
- for /l %%a in (!n! -1 1) do (
- set "s=!num:~,-%%a!"
- if "!s:~,1!" == "0" set "s=!s:~1!"
- set /a m=s%%1048576,s/=1048576
- set "%2=!%2!!s!"
- set "num=!m!!num:~-%%a!"
- )
- if not defined %2 (
- set "%2=!num:~,-1!"
- ) 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |