Board logo

标题: [数值计算] [已解决]求列举磁盘各分区剩余空间的批处理脚本(帮修改也可以) [打印本页]

作者: habulu    时间: 2015-10-17 22:57     标题: [已解决]求列举磁盘各分区剩余空间的批处理脚本(帮修改也可以)

本帖最后由 habulu 于 2015-10-19 21:02 编辑

有个磁盘空间检查脚本是这样的:
  1. echo **********************************%date%********************************>C:\mail2.txt
  2. echo.>>C:\mail2.txt
  3. echo.>>C:\mail2.txt
  4. echo        ══════════════════════════════>>C:\mail2.txt
  5. echo                磁盘分区                         剩余空间(GB)       >>C:\mail2.txt
  6. rem echo        ________________________________________________   >>C:\mail2.tx
  7. setlocal enabledelayedexpansion
  8. for %%a 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 (
  9.     if exist %%a:\nul (
  10.         for /f "tokens=3" %%b in ('dir /-c %%a:\^|find "可用字节"') do (
  11.             set freesize=%%b
  12.             set /a freesize=!freesize:~0,-3!/1049/1024>nul 2>nul
  13.             set freesize=                 !freesize!
  14. echo                 %%a:                         !freesize:~-17!       >>C:\mail2.txt
  15.         )
  16.     )
  17. )
  18. echo        ═════════════════════════════>>C:\mail2.txt
复制代码
但是当D盘空间超过2.5T后,就没转换为G了(C盘还是有转换为G的,但D盘大约2.5T,就没转换了)
       ══════════════════════════════
               磁盘分区                         剩余空间(GB)      
                C:                                        75      
                D:                             2572068761600      
       ═════════════════════════════

求修改脚本,或给个类似脚本
作者: pcl_test    时间: 2015-10-18 00:38

拒绝回复不安版规发帖的求助
作者: habulu    时间: 2015-10-18 01:15

额  标题不符么,改了
作者: CrLf    时间: 2015-10-18 01:49

回复 3# habulu



代码未放 code 里,这回帮你改了,下次发代码的时候记得戳一下文本框上方倒数第三个按钮
不过这是小问题,发帖时标题和内容清晰明确最重要
作者: DAIC    时间: 2015-10-18 14:03

set /a 命令无法进行大数计算,参考 set 教程第6页:
http://bbs.bathome.net/thread-31727-1-1.html
作者: pcl_test    时间: 2015-10-18 16:43

  1. //&cls&cscript -nologo -e:jscript "%~f0"&pause&exit
  2. function GetSize(val)
  3. {
  4.     var s ='';
  5.     if(val >= 1125899906842624)
  6.         s = parseInt((val/1125899906842624)*100)/100+' PB';
  7.     else if(val >= 1099511627776)
  8.         s = parseInt((val/1099511627776)*100)/100+' TB';
  9.     else if (val >= 1073741824)
  10.         s = parseInt((val/1073741824)*100)/100+' GB';
  11.     else if (val >= 1048576)
  12.         s = parseInt((val/1048576)*100)/100+' MB';
  13.     else if (val >= 1024)
  14.         s = parseInt((val/1024)*100)/100+' KB';
  15.     else s = val+' 字节';
  16.     return s;
  17. }
  18. var fso = new ActiveXObject('Scripting.FileSystemObject');
  19. var enu = new Enumerator(fso.Drives);
  20. var str = '';
  21. var head = '盘符   类型   总容量   已用容量   剩余容量   使用率   文件系统\r\n'+
  22.     '--------------------------------------------------------------';
  23. for (; !enu.atEnd(); enu.moveNext())
  24. {  
  25.     var drive = enu.item();
  26.     if (drive.isReady)
  27.     {
  28.         var type = '';
  29.         var UsedSpace = drive.TotalSize-drive.FreeSpace;
  30.         switch(drive.DriveType)
  31.         {
  32.             case 0:type = 'Unknown';break;
  33.             case 1:type = 'Removable';break;
  34.             case 2:type = 'Fixed';break;
  35.             case 3:type = 'Network';break;
  36.             case 4:type = 'CD-ROM';break;
  37.             case 5:type = 'RAM disk';break;
  38.             default:type = 'Unknown';
  39.         }
  40.         str += drive.DriveLetter+'   '+type+'   '+
  41.             GetSize(drive.TotalSize)+'   '+
  42.                 GetSize(UsedSpace)+'   '+
  43.                     GetSize(drive.FreeSpace)+'   '+
  44.                         parseInt(UsedSpace/drive.TotalSize*100)+'%   '+
  45.                             drive.FileSystem+'\r\n';
  46.     }
  47. }  
  48. WSH.echo(head+'\r\n'+str);
复制代码

作者: ygqiang    时间: 2015-10-18 17:27

回复 6# pcl_test


    结果正确。。但是显示的结果,上下能否对齐呢?多谢。。
作者: CrLf    时间: 2015-10-18 18:14

本帖最后由 CrLf 于 2015-10-18 18:19 编辑

回复 7# ygqiang


    可自行在代码中加入tab字符左对齐,就是键盘最左边那个tab,不懂vbs没关系,靠感觉多试几次就出来了
作者: ygqiang    时间: 2015-10-20 07:30

回复 6# pcl_test


    显示的结果,上下还是不对齐?麻烦了。。
作者: ygqiang    时间: 2015-10-20 07:33

回复 8# CrLf


    不同磁盘/容量情况不一样。。

要实现上下对齐,好像比较难吧?
作者: 依山居    时间: 2015-10-23 22:25

神手党一辈子啊。
作者: bailong360    时间: 2015-10-25 19:06

回复 8# CrLf
可是pcl写的是js
作者: CrLf    时间: 2015-10-25 22:44

回复 10# ygqiang


    你试过 tab 了吗?
作者: ygqiang    时间: 2015-10-26 08:39

回复 13# CrLf


    下面是另一个代码。。
  1. @echo off
  2. echo ——————————————————————————————————————— >nul 2>nul
  3. if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
  4. for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (
  5.     more +%%i "%~f0" > c:\diskinfo.vbs
  6. )
  7. ping 127.0.0.1 -n 2 >nul 2>nul
  8. cls
  9. cscript /nologo c:\diskinfo.vbs
  10. ping 127.0.0.1 -n 2 >nul 2>nul
  11. CScript /NoLogo c:\diskinfo.vbs>c:\diskinfo.txt
  12. ping 127.0.0.1 -n 2 >nul 2>nul
  13. cls
  14. Type c:\diskinfo.txt
  15. ping 127.0.0.1 -n 5 >nul 2>nul & if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
  16. echo ——————————————————————————————————————— >nul 2>nul
  17. if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
  18. set "vbs=c:\diskinfo.vbs"
  19. set "log=c:\diskinfo.log"
  20. for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (more +%%i "%~f0" > "%vbs%")
  21. CScript //NoLogo "%vbs%" > "%log%"
  22. cls
  23. type "%log%"
  24. ping 127.0.0.1 -n 5 >nul 2>nul & if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul) & exit/b
  25. goto :eof
  26. echo ——————————————————————————————————————— >nul 2>nul
  27. :DynamicScript
  28. Main
  29. Sub Main()
  30.   Dim objWMI, colDisks
  31.   Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  32.   Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  33.   ' 获取硬盘最大序号
  34.   nIndexMax = 0
  35.   For Each objDisk in colDisks
  36.     If Cint(objDisk.Index) > nIndexMax Then nIndexMax = Cint(objDisk.Index)
  37.   Next
  38.   ' 按序号取信息
  39.   For i = 0 To nIndexMax
  40.     For Each objDisk in colDisks
  41.       ' 只取该序号信息
  42.       If objDisk.Index = i Then
  43.         s = s & "硬盘" & objDisk.Index & ":" & vbTab
  44.         s = s & "大小:" & GetSize(objDisk.Size) & vbTab
  45.         s = s & "型号:" & objDisk.Caption & vbTab
  46.         s = s & "分区表:" & IsGPT(objDisk.Index) & vbCrLf
  47.         strDiskID = Replace(objDisk.DeviceID, "\", "\\")
  48.         Set colPartitions = objWMI.ExecQuery _
  49.             ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
  50.             & " where AssocClass=Win32_DiskDriveToDiskPartition")
  51.         For Each objPartition in colPartitions
  52.           strPartId = objPartition.DeviceID
  53.           Set colLogicalDisks = objWMI.ExecQuery _
  54.               ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId _
  55.               & """}  where AssocClass=Win32_LogicalDiskToPartition")
  56.           For Each objLogicalDisk in colLogicalDisks
  57.             size = objLogicalDisk.Size
  58.             free = objLogicalDisk.Freespace
  59.             used = FormatNumber((size - free) / size * 100, 2, true) & "%"
  60.             s = s & "分区" & objLogicalDisk.DeviceID & vbTab
  61.             s = s & "大小:" & GetSize(size) & vbTab
  62.             s = s & "剩余:" & GetSize(free) & vbTab
  63.             s = s & "使用率:" & used & vbCrLf
  64.           Next
  65.         Next
  66.         s = s & vbCrLf
  67.       End If
  68.     Next
  69.   Next
  70.   WScript.Echo s
  71. End Sub
  72. ' 格式化
  73. Function GetSize(intSize)
  74.   If intSize/1024/1024 > 1024 Then
  75.     GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  76.   Else
  77.     GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  78.   End If
  79. End Function
  80. ' 获取指定硬盘的分区表类型(GPT/MBR)
  81. Function IsGPT(ByVal nDiskIndex)
  82.   IsGPT = "MBR"
  83.   Dim wso, sLogFile, sText
  84.   Set wso = CreateObject("WScript.Shell")
  85.   sLogFile = wso.ExpandenVironmentStrings("%temp%\diskpart.log")
  86.   wso.Run "cmd /c ""chcp 437 & cls & (echo list disk | diskpart | find /i ""Disk " & nDiskIndex & """) >""" & sLogFile & """ "" ", 0, False
  87.   Call TxtFile(sLogFile, 1, -2, sText)
  88.   If Trim(Right(sText,3)) = "*" Then IsGPT = "GPT"
  89. End Function
  90. ' 对文本指定编码进行读写操作2
  91. 'nRW: 1只读, 2只写, 8追加 'nCharset: -2(系统), -1(Unicode), 0(ASCII)
  92. Sub TxtFile(ByVal FileName, ByVal nRW, ByVal nCharset, ByRef sText)
  93.   Dim fso :  Set fso = CreateObject("Scripting.filesystemobject")
  94.   If sText <> "" And (nRW = 2 Or nRW = 8) Then
  95.     fso.OpenTextFile(FileName, nRW, True, nCharset).Write sText
  96.   ElseIf fso.FileExists(FileName) And nRW = 1 Then
  97.     If fso.GetFile(FileName).Size > 0 Then _
  98.       sText = fso.OpenTextFile(FileName, nRW, False, nCharset).ReadAll
  99.   End If
  100. End Sub
  101. ' 以管理员身份运行
  102. Sub RunAsAdmin()
  103.   Dim objItems, objItem, strVer, nVer
  104.   Set objItems = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
  105.   For Each objItem In objItems
  106.     strVer = objItem.Version
  107.   Next
  108.   nVer = Split(strVer, ".")(0) & Split(strVer, ".")(1)
  109.   If nVer >= 60 Then
  110.     Dim oShell, oArg, strArgs
  111.     Set oShell = CreateObject("Shell.Application")
  112.     If Not WScript.Arguments.Named.Exists("ADMIN") Then
  113.       For Each oArg In WScript.Arguments
  114.         strArgs = strArgs & " """ & oArg & """"
  115.       Next
  116.       strArgs = strArgs & " /ADMIN:1"
  117.       Call oShell.ShellExecute("WScript.exe", """" & WScript.ScriptFullName & """" & strArgs, "", "runas", 1)
  118.       Set oShell = Nothing
  119.       WScript.Quit(0)
  120.     End If
  121.     Set oShell = Nothing
  122.   End If
  123. End Sub
复制代码

作者: terse    时间: 2015-10-26 10:50

修改下一楼的
  1. @echo off & setlocal enabledelayedexpansion
  2. set md=1048576
  3. for %%a 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 (
  4.     if exist %%a:\nul (
  5.         for /f "tokens=3" %%b in ('dir /-c %%a:\^|find "可用字节"') do (
  6.             set "fsize=%%b00"
  7.             set s=!fsize!&set len=0
  8.             if "!s:~16!" neq "" set len=16&set "s=!s:~16!"
  9.             set s=!s!FEDCBA9876543210
  10.             set/a "len+=0x!s:~16,1!"
  11.             set/a "r=!fsize:~,8!%%md,t=!fsize:~,8!/md"
  12.             for /l %%j in (8 1 !len!) do (
  13.                 set/a "q=!r!!fsize:~%%j,1!/md,r=!r!!fsize:~%%j,1!%%md"
  14.                 set "t=!t!!q!"
  15.             )
  16.             set /a t/=1024
  17.             if "!t:~,-2!" == "" (set g=0&set t=00!t!) else set "g=!t:~,-2!"
  18.             set g=!g!.!t:~-2!
  19.             echo %%a: !g!
  20.         )
  21.     )
  22. )
  23. pause
复制代码

作者: 樵夫    时间: 2018-4-2 16:12

回复 6# pcl_test


    怎么输入到文本呢?




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