Board logo

标题: [系统相关] [已解决]批处理如何判断硬盘是MBR分区还是GPT分区? [打印本页]

作者: pcl_test    时间: 2014-12-31 13:00     标题: [已解决]批处理如何判断硬盘是MBR分区还是GPT分区?

本帖最后由 pcl_test 于 2017-5-2 00:44 编辑

如题,批处理如何判断硬盘是MBR分区还是GPT分区?
作者: yiwuyun    时间: 2014-12-31 19:14

我原来写的一段代码:
  1. :IsGPT
  2. rem 判定是否是GPT磁盘。
  3. echo list disk >yiwuyun.txt
  4. for /f "skip=8 tokens=3 delims=B" %%k in ('diskpart /s yiwuyun.txt') do (
  5. set temp=%%k
  6. if "!temp:~8,1!"=="*" goto gpt
  7. )
  8. set gpt=false
  9. echo Your disk is MBR disk!
  10. goto nogpt
  11. :gpt
  12. set gpt=true
  13. echo Your disk is GPT disk!
  14. :nogpt
  15. if exist yiwuyun.txt del yiwuyun.txt || exit /b 1
  16. rem echo errorlevel is !errorlevel!
  17. exit /b 0
复制代码

作者: pcl_test    时间: 2015-1-1 08:39

回复 2# yiwuyun
感谢提供一种方法,我改了下代码,表示可以判断
作者: ygqiang    时间: 2015-1-1 23:30

我原来写的一段代码:
yiwuyun 发表于 2014-12-31 19:14



    如果有2个或者多个硬盘,如何判断每个硬盘的情况呢?
作者: ygqiang    时间: 2015-1-20 17:03

如题,批处理如何判断硬盘是MBR分区还是GTP分区?
pcl_test 发表于 2014-12-31 13:00
  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.   For Each objDisk in colDisks
  34.     s = s & "硬盘" & objDisk.Index & ":" & vbTab
  35.     s = s & "大小:" & GetSize(objDisk.Size) & vbTab
  36.     s = s & "型号:" & objDisk.Caption & vbTab
  37.     s = s & "分区表:" & IsGPT(objDisk.Index) & vbCrLf
  38.     strDiskID = Replace(objDisk.DeviceID, "\", "\\")
  39.     Set colPartitions = objWMI.ExecQuery _
  40.         ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
  41.         & " where AssocClass=Win32_DiskDriveToDiskPartition")
  42.     For Each objPartition in colPartitions
  43.       strPartId = objPartition.DeviceID
  44.       Set colLogicalDisks = objWMI.ExecQuery _
  45.           ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId & """}  where AssocClass=Win32_LogicalDiskToPartition")
  46.       For Each objLogicalDisk in colLogicalDisks
  47.         size = objLogicalDisk.Size
  48.         free = objLogicalDisk.Freespace
  49.         used = FormatNumber((size - free) / size * 100, 2, true) & "%"
  50.         s = s & "分区" & objLogicalDisk.DeviceID & vbTab
  51.         s = s & "大小:" & GetSize(size) & vbTab
  52.         s = s & "剩余:" & GetSize(free) & vbTab
  53.         s = s & "使用率:" & used & vbCrLf
  54.       Next
  55.     Next
  56.     s = s & vbCrLf
  57.   Next
  58.   WScript.Echo s
  59. End Sub
  60. ' 格式化
  61. Function GetSize(intSize)
  62.   If intSize/1024/1024 > 1024 Then
  63.     GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  64.   Else
  65.     GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  66.   End If
  67. End Function
  68. ' 获取指定硬盘的分区表类型(GPT/MBR)
  69. Function IsGPT(ByVal nDiskIndex)
  70.   IsGPT = "MBR"
  71.   Dim wso, sLogFile, sText
  72.   Set wso = CreateObject("WScript.Shell")
  73.   sLogFile = wso.ExpandenVironmentStrings("%temp%\diskpart.log")
  74.   wso.Run "cmd /c ""chcp 437 & cls & (echo list disk | diskpart | find /i ""Disk " & nDiskIndex & """) >""" & sLogFile & """ "" ", 0, False
  75.   Call TxtFile(sLogFile, 1, -2, sText)
  76.   If Trim(Right(sText,3)) = "*" Then IsGPT = "GPT"
  77. End Function
  78. ' 对文本指定编码进行读写操作2
  79. 'nRW: 1只读, 2只写, 8追加 'nCharset: -2(系统), -1(Unicode), 0(ASCII)
  80. Sub TxtFile(ByVal FileName, ByVal nRW, ByVal nCharset, ByRef sText)
  81.   Dim fso :  Set fso = CreateObject("Scripting.filesystemobject")
  82.   If sText <> "" And (nRW = 2 Or nRW = 8) Then
  83.     fso.OpenTextFile(FileName, nRW, True, nCharset).Write sText
  84.   ElseIf fso.FileExists(FileName) And nRW = 1 Then
  85.     If fso.GetFile(FileName).Size > 0 Then _
  86.       sText = fso.OpenTextFile(FileName, nRW, False, nCharset).ReadAll
  87.   End If
  88. End Sub
  89. ' 以管理员身份运行
  90. Sub RunAsAdmin()
  91.   Dim objItems, objItem, strVer, nVer
  92.   Set objItems = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
  93.   For Each objItem In objItems
  94.     strVer = objItem.Version
  95.   Next
  96.   nVer = Split(strVer, ".")(0) & Split(strVer, ".")(1)
  97.   If nVer >= 60 Then
  98.     Dim oShell, oArg, strArgs
  99.     Set oShell = CreateObject("Shell.Application")
  100.     If Not WScript.Arguments.Named.Exists("ADMIN") Then
  101.       For Each oArg In WScript.Arguments
  102.         strArgs = strArgs & " """ & oArg & """"
  103.       Next
  104.       strArgs = strArgs & " /ADMIN:1"
  105.       Call oShell.ShellExecute("WScript.exe", """" & WScript.ScriptFullName & """" & strArgs, "", "runas", 1)
  106.       Set oShell = Nothing
  107.       WScript.Quit(0)
  108.     End If
  109.     Set oShell = Nothing
  110.   End If
  111. End Sub
复制代码

作者: 迅雷会员    时间: 2016-8-25 18:45

回复 6# ygqiang
你好,我的电脑是GPT分区和MBR分区,但是检测的结果都是MBR分区\
作者: pcl_test    时间: 2016-8-25 19:43

回复 7# 迅雷会员
  1. echo;list disk|diskpart|findstr /rc:"磁盘 [0-9][0-9]*"
复制代码
显示什么
作者: 迅雷会员    时间: 2016-8-26 08:14

回复 8# pcl_test

\
作者: pcl_test    时间: 2016-8-26 11:13

回复 9# 迅雷会员


    6楼95行
  1. If Trim(Right(sText,3)) = "*" Then IsGPT = "GPT"
复制代码
改为
  1. If InStrRev(sText, "*")>0 Then IsGPT = "GPT"
复制代码

作者: 迅雷会员    时间: 2016-8-26 12:46

回复 10# pcl_test

感谢版主回复,这下正常了
作者: 迅雷会员    时间: 2016-8-26 12:47

回复 6# ygqiang


    按照楼上版主的回复已经正常了
作者: 迅雷会员    时间: 2016-8-26 18:22

回复 5# ygqiang


    如果要把显示的内容保存在TXT文件应该如何操作呢
作者: pcl_test    时间: 2016-8-26 19:56

回复 12# 迅雷会员

6楼75行
  1. WScript.Echo s
复制代码
改为
  1. CreateObject("Scripting.filesystemobject").CreateTextFile("结果.txt",2).Write s
复制代码

作者: 飛雪    时间: 2017-5-1 09:33

回复 9# pcl_test


請問一下,我的第二個 disk 是 GPT,但判斷出來依舊是 MBR

已經修改 If InStrRev(sText, "*")>0 Then IsGPT = "GPT"
作者: pcl_test    时间: 2017-5-1 09:54

本帖最后由 pcl_test 于 2017-5-1 09:58 编辑

回复 14# 飛雪
  1. If InStrRev(sText, "*", -1, 1)>0 Then IsGPT = "GPT"
复制代码

作者: 飛雪    时间: 2017-5-1 10:16

回复 15# pcl_test


感謝版主回覆

好像只能判斷第一個 DISK 是 GPT,第二個 DISK 就會判斷成 MBR 了...
作者: pcl_test    时间: 2017-5-1 10:38

回复 16# 飛雪

6楼94、95行改为
  1. Call TxtFile(sLogFile, 1, 0, sText)
  2.   If InStrRev(sText, "*", -1, 1)>0 Then IsGPT = "GPT"
复制代码
如果还不行,把temp临时文件夹里的diskpart.log上传附件看看
作者: 飛雪    时间: 2017-5-1 10:42

回复 17# pcl_test


還是不行, %TMP% 底下的 log 只有一行

  Disk 0    Online           60 GB      0 B
作者: 飛雪    时间: 2017-5-1 10:58

反覆運行後

我發現 disk 2 有時可以正常判斷為 GPT,但大多數都是判斷成 MBR


所以應該是 log 部分的寫入有問題
作者: pcl_test    时间: 2017-5-1 13:09

本帖最后由 pcl_test 于 2017-5-1 23:55 编辑

回复 19# 飛雪
vbs
  1. Set ws = CreateObject("Wscript.Shell")
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. If LCase(Right(WSH.FullName, 11)) = "wscript.exe" Then
  4.     ws.run "cscript.exe -nologo """ & WSH.ScriptFullName & """", 0
  5.     WSH.Quit
  6. End If
  7. Dim arr()
  8. Set oExec = ws.Exec("cmd /c ""(echo;list disk|diskpart)|findstr /irc:""[0-9][0-9]*  *[tgmk]b"" "" ")
  9. Do While oExec.StdOut.AtEndOfStream <> true
  10.     str = Trim(oExec.StdOut.ReadLine)
  11.     num = CInt(Split(str, " ")(1))
  12.     ReDim Preserve arr(num)
  13.     If InStrRev(str, "*") >0 Then
  14.         arr(num) = "GPT"
  15.     Else
  16.         arr(num) = "MBR"
  17.     End If
  18. Loop
  19. Dim objWMI, colDisks
  20. Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  21. Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  22. For Each objDisk in colDisks
  23.     s = s & "硬盘" & objDisk.Index & ":" & vbTab
  24.     s = s & "大小:" & GetSize(objDisk.Size) & vbTab
  25.     s = s & "型号:" & objDisk.Caption & vbTab
  26.     s = s & "分区表:" & arr(CInt(objDisk.Index)) & vbCrLf
  27.     strDiskID = Replace(objDisk.DeviceID, "\", "\\")
  28.     Set colPartitions = objWMI.ExecQuery _
  29.         ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
  30.         & " where AssocClass=Win32_DiskDriveToDiskPartition")
  31.     For Each objPartition in colPartitions
  32.       strPartId = objPartition.DeviceID
  33.       Set colLogicalDisks = objWMI.ExecQuery _
  34.           ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId & """}  where AssocClass=Win32_LogicalDiskToPartition")
  35.       For Each objLogicalDisk in colLogicalDisks
  36.         size = objLogicalDisk.Size
  37.         free = objLogicalDisk.Freespace
  38.         used = FormatNumber((size - free) / size * 100, 2, true) & "%"
  39.         s = s & "分区" & objLogicalDisk.DeviceID & vbTab
  40.         s = s & "大小:" & GetSize(size) & vbTab
  41.         s = s & "剩余:" & GetSize(free) & vbTab
  42.         s = s & "使用率:" & used & vbCrLf
  43.       Next
  44.     Next
  45.     s = s & vbCrLf
  46. Next
  47. Msgbox s
  48. Function GetSize(intSize)
  49.   If intSize/1024/1024 > 1024 Then
  50.     GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  51.   Else
  52.     GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  53.   End If
  54. End Function
复制代码

作者: 飛雪    时间: 2017-5-1 15:19

回复 20# pcl_test


非常感謝,很完滿的正確顯示 MBR 跟 GPT 了

但是我使用批處理 cscript //Nologo 調用 vbs,變成彈窗了

有辦法直接在批處理中顯示嗎?

謝謝
作者: 飛雪    时间: 2017-5-1 17:35

已解決

將 Msgbox s mark 掉
下面加一行 WScript.Echo s 就可以了

謝謝版主




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