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

[系统相关] [已解决]批处理如何判断硬盘是MBR分区还是GPT分区?

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

如题,批处理如何判断硬盘是MBR分区还是GPT分区?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

已解決

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

謝謝版主

TOP

回复 20# pcl_test


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

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

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

謝謝

TOP

本帖最后由 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
复制代码

TOP

反覆運行後

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


所以應該是 log 部分的寫入有問題

TOP

回复 17# pcl_test


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

  Disk 0    Online           60 GB      0 B

TOP

回复 16# 飛雪

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

TOP

回复 15# pcl_test


感謝版主回覆

好像只能判斷第一個 DISK 是 GPT,第二個 DISK 就會判斷成 MBR 了...

TOP

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

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

TOP

回复 9# pcl_test


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

已經修改 If InStrRev(sText, "*")>0 Then IsGPT = "GPT"

TOP

回复 12# 迅雷会员

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

评分人数

TOP

回复 5# ygqiang


    如果要把显示的内容保存在TXT文件应该如何操作呢

TOP

回复 6# ygqiang


    按照楼上版主的回复已经正常了

TOP

回复 10# pcl_test

感谢版主回复,这下正常了

TOP

回复 9# 迅雷会员


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

TOP

返回列表