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

[数值计算] 不支持32位以上的字符,批处理计算磁盘空间怎样以GB为单位?

  1. @echo off
  2. rem write to log
  3. set filename=磁盘空间日志.log
  4. echo -------------------这是一条没有感情的分割线------------------------- >>%filename%
  5. echo Start >>%filename%
  6. echo (%date% %time%) >>%filename%
  7. net use O: \192.168.0.127\127d Kovn2020 /user:administrator
  8. net use P: \192.168.0.128\128d Kovn2020 /user:administrator
  9. net use Q: \192.168.0.130\130d Kovn2020 /user:administrator
  10. setlocal enabledelayedexpansion
  11. :Main
  12. cls
  13. set /a num2=1024*1024
  14. for %%i 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 (
  15. if exist %%i: (
  16. set num3_str=
  17. set num4=
  18. for /f "tokens=3" %%j in ('dir /-c %%i:') do set num1=%%j
  19. if not "!num1!"=="0" (
  20. call :loop
  21. for /f "delims=0 tokens=" %%k in ("!num3_str!") do set num3_str=%%k
  22. echo.
  23. echo %%i 盘剩余空间为 !num3_str! MB
  24. echo %%i !num3_str! MB >>%filename%
  25. echo.
  26. )
  27. )
  28. )
  29. )
  30. net use O: /delete /y
  31. net use P: /delete /y
  32. net use Q: /delete /y
  33. pause
  34. goto Main
  35. :loop
  36. :: 求商
  37. set /a num3=%num4%%num1:~0,1%/%num2%
  38. :: 求商序列
  39. set num3_str=%num3_str%%num3%
  40. :: 求余
  41. set /a num4=%num4%%num1:~0,1%%%%num2%
  42. if %num4% equ 0 set num4=
  43. set num1=%num1:~1%
  44. if not "%num1%"=="" goto loop
  45. goto :eof
  46. echo End >>%filename%
  47. echo (%date% %time%) >>%filename%
复制代码
怎么才能使导出的文件单位是G呢? 不支持32位以上的字符,能不能曲线救国?通过其他办法解决一下

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 terse 于 2019-10-11 15:42 编辑

CALL出来影响效率 直接FOR里计算吧
  1. set md=1048576
  2. for %%i 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 (
  3.        if exist %%i: (
  4.           set num3_str=
  5.           set num4=
  6.           for /f "tokens=3" %%j in ('dir /-c %%i:') do set num1=%%j00
  7.           set len=0
  8.           set s=!num1!
  9.           for %%j in (16 8 4 2 1) do if "!s:~%%j!" neq "" set/a len+=%%j&set "s=!s:~%%j!"
  10.           set/a "r=!num1:~,8!%%md,m=!num1:~,8!/md"
  11.           for /l %%j in (8 1 !len!) do (
  12.                set/a "q=!r!!num1:~%%j,1!/md,r=!r!!num1:~%%j,1!%%md"
  13.                set "m=!m!!q!"
  14.           )
  15.           set /a g=m/1024
  16.           echo %%i  盘剩余空间为 !g:~,-2!.!g:~-2!  G
  17.           echo %%i  盘剩余空间为 !m:~,-2!.!m:~-2! MB
  18.           echo.
  19.        )
  20. )
  21. PAUSE
复制代码

TOP

回复 3# terse


   
要加setlocal enabledelayedexpansion

TOP

  1. //&cls&cscript -nologo -e:jscript "%~f0"&ping 127.0.0.1 -n 15 >nul 2>nul&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.     s=s+new Array(10-s.length).join(" ");
  17.     return s;
  18. }
  19. var fso = new ActiveXObject('Scripting.FileSystemObject');
  20. var enu = new Enumerator(fso.Drives);
  21. var str = '';
  22. var head = '盘符   类型     总容量      已用容量    剩余容量   使用率   文件系统\r\n'+
  23.     '--------------------------------------------------------------------';
  24. for (; !enu.atEnd(); enu.moveNext())
  25. {  
  26.     var drive = enu.item();
  27.     if (drive.isReady)
  28.     {
  29.         var type = '';
  30.         var UsedSpace = drive.TotalSize-drive.FreeSpace;
  31.         switch(drive.DriveType)
  32.         {
  33.             case 0:type = 'Unknown  ';break;
  34.             case 1:type = 'Removable';break;
  35.             case 2:type = 'Fixed    ';break;
  36.             case 3:type = 'Network  ';break;
  37.             case 4:type = 'CD-ROM   ';break;
  38.             case 5:type = 'RAM disk ';break;
  39.             default:type = 'Unknown';
  40.         }
  41.         str += ' '+drive.DriveLetter+'     '+type+''+
  42.             GetSize(drive.TotalSize)+'   '+
  43.                 GetSize(UsedSpace)+'   '+
  44.                     GetSize(drive.FreeSpace)+'   '+
  45.                         parseInt(UsedSpace/drive.TotalSize*100)+'%      '+
  46.                             drive.FileSystem+'\r\n';
  47.     }
  48. }  
  49. WSH.echo(head+'\r\n'+str);
复制代码

TOP

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

TOP

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

TOP

返回列表