Board logo

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

作者: ygqiang    时间: 2015-1-2 01:04     标题: [已解决]批处理如何判断多个硬盘分别/各自是MBR分区还是GPT分区?

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

[已解决]如果有2个或者多个硬盘,如何判断每个硬盘是MBR分区还是GTP分区?
  1. @echo off
  2. :IsGPT
  3. rem 判定是否是GPT磁盘。
  4. echo list disk >yiwuyun.txt
  5. for /f "skip=8 tokens=3 delims=B" %%k in ('diskpart /s yiwuyun.txt') do (
  6.         set temp=%%k
  7.         if "!temp:~8,1!"=="*" goto gpt
  8. )
  9. set gpt=false
  10. echo Your disk is MBR disk!
  11. ping 127.0.0.1 -n 5 >nul 2>nul
  12. goto nogpt
  13. :gpt
  14. set gpt=true
  15. echo Your disk is GPT disk!
  16. ping 127.0.0.1 -n 5 >nul 2>nul
  17. :nogpt
  18. if exist yiwuyun.txt del yiwuyun.txt || exit /b 1
  19. rem echo errorlevel is !errorlevel!
  20. exit /b 0
复制代码
最好能与下面的bat代码,合并下。
bat显示硬盘及分区容量。
  1. @echo off
  2. del /q c:\diskinfo.* >nul 2>nul
  3. for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (
  4.     more +%%i "%~f0" > c:\diskinfo.vbs
  5. )
  6. ping 127.0.0.1 -n 2 >nul 2>nul
  7. echo ——————————————————————————————————————— >nul 2>nul
  8. start c:\diskinfo.vbs
  9. ping 127.0.0.1 -n 5 >nul 2>nul
  10. cls
  11. type c:\diskinfo.txt
  12. ping 127.0.0.1 -n 15 >nul 2>nul & del /q c:\diskinfo.* & exit/b
  13. goto :eof
  14. echo ——————————————————————————————————————— >nul 2>nul
  15. :DynamicScript
  16. Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  17. Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  18. For Each objDisk in colDisks
  19.     i = i + 1
  20.     s = s & "硬盘" & i & ":" & vbTab
  21.     s = s & "大小:" & GetSize(objDisk.Size) & vbTab
  22.     s = s & "型号:" & objDisk.Caption & vbCrLf
  23.     strDiskID = Replace(objDisk.DeviceID, "\", "\\")
  24.     Set colPartitions = objWMI.ExecQuery _
  25.     ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
  26.     & " where AssocClass=Win32_DiskDriveToDiskPartition")
  27.     For Each objPartition in colPartitions
  28.         strPartId = objPartition.DeviceID
  29.         Set colLogicalDisks = objWMI.ExecQuery _
  30.         ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId & """}  where AssocClass=Win32_LogicalDiskToPartition")
  31.         For Each objLogicalDisk in colLogicalDisks
  32.             size = objLogicalDisk.Size
  33.             free = objLogicalDisk.Freespace
  34.             used = FormatNumber((size - free) / size * 100, 2, true) & "%"
  35.             s = s & "分区" & objLogicalDisk.DeviceID & vbTab
  36.             s = s & "大小:" & GetSize(size) & vbTab
  37.             s = s & "剩余:" & GetSize(free) & vbTab
  38.             s = s & "使用率:" & used & vbCrLf
  39.         Next
  40.     Next
  41.     s = s & vbCrLf
  42. Next
  43. Set fso = CreateObject("Scripting.FileSystemObject")
  44. fso.OpenTextFile("c:\diskinfo.txt", 2, true).Write s
  45. Function GetSize(intSize)
  46.     If intSize/1024/1024 > 1024 Then
  47.         GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  48.     Else
  49.         Getize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  50.     End If
  51. End Function
复制代码

作者: yiwuyun    时间: 2015-1-2 09:29

其实原理是一样的,依次对每个硬盘号进行判定就可以了。如果用VBS,而不是纯批,在WINPE下可能行不通。只有纯批才能保证在WINPE下也能运行。
作者: ygqiang    时间: 2015-1-2 10:14

回复 2# yiwuyun


    帮忙合并下1楼的2个代码?谢谢

最好合并成1个bat文件。谢谢
作者: yu2n    时间: 2015-1-2 12:51

第一个脚本不能达到功能吗?
第二个脚本是BAT+VBS混编。
作者: ygqiang    时间: 2015-1-2 16:55

第一个脚本不能达到功能吗?
第二个脚本是BAT+VBS混编。
yu2n 发表于 2015-1-2 12:51




第一个bat 。
只能判断1个硬盘的gpt情况

如果有2个或者多个硬盘,如何判断每个硬盘是MBR还是GTP?
作者: DAIC    时间: 2015-1-2 18:49

试试这样合并:
  1. @echo off
  2. :IsGPT
  3. rem 判定是否是GPT磁盘。
  4. echo list disk >yiwuyun.txt
  5. for /f "skip=8 tokens=3 delims=B" %%k in ('diskpart /s yiwuyun.txt') do (
  6.         set temp=%%k
  7.         if "!temp:~8,1!"=="*" goto gpt
  8. )
  9. set gpt=false
  10. echo Your disk is MBR disk!
  11. ping 127.0.0.1 -n 5 >nul 2>nul
  12. goto nogpt
  13. :gpt
  14. set gpt=true
  15. echo Your disk is GPT disk!
  16. ping 127.0.0.1 -n 5 >nul 2>nul
  17. :nogpt
  18. del /f /q yiwuyun.txt
  19. del /q c:\diskinfo.* >nul 2>nul
  20. for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (
  21.     more +%%i "%~f0" > c:\diskinfo.vbs
  22. )
  23. ping 127.0.0.1 -n 2 >nul 2>nul
  24. echo ——————————————————————————————————————— >nul 2>nul
  25. start c:\diskinfo.vbs
  26. ping 127.0.0.1 -n 5 >nul 2>nul
  27. cls
  28. type c:\diskinfo.txt
  29. ping 127.0.0.1 -n 15 >nul 2>nul & del /q c:\diskinfo.* & exit/b
  30. goto :eof
  31. echo ——————————————————————————————————————— >nul 2>nul
  32. :DynamicScript
  33. Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  34. Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  35. For Each objDisk in colDisks
  36.     i = i + 1
  37.     s = s & "硬盘" & i & ":" & vbTab
  38.     s = s & "大小:" & GetSize(objDisk.Size) & vbTab
  39.     s = s & "型号:" & objDisk.Caption & vbCrLf
  40.     strDiskID = Replace(objDisk.DeviceID, "\", "\\")
  41.     Set colPartitions = objWMI.ExecQuery _
  42.     ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
  43.     & " where AssocClass=Win32_DiskDriveToDiskPartition")
  44.     For Each objPartition in colPartitions
  45.         strPartId = objPartition.DeviceID
  46.         Set colLogicalDisks = objWMI.ExecQuery _
  47.         ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId & """}  where AssocClass=Win32_LogicalDiskToPartition")
  48.         For Each objLogicalDisk in colLogicalDisks
  49.             size = objLogicalDisk.Size
  50.             free = objLogicalDisk.Freespace
  51.             used = FormatNumber((size - free) / size * 100, 2, true) & "%"
  52.             s = s & "分区" & objLogicalDisk.DeviceID & vbTab
  53.             s = s & "大小:" & GetSize(size) & vbTab
  54.             s = s & "剩余:" & GetSize(free) & vbTab
  55.             s = s & "使用率:" & used & vbCrLf
  56.         Next
  57.     Next
  58.     s = s & vbCrLf
  59. Next
  60. Set fso = CreateObject("Scripting.FileSystemObject")
  61. fso.OpenTextFile("c:\diskinfo.txt", 2, true).Write s
  62. Function GetSize(intSize)
  63.     If intSize/1024/1024 > 1024 Then
  64.         GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  65.     Else
  66.         Getize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  67.     End If
  68. End Function
复制代码

作者: ygqiang    时间: 2015-1-2 19:38

试试这样合并:
DAIC 发表于 2015-1-2 18:49



    1楼的2个bat代码。

第一个bat 。只能判断1个硬盘的gpt情况

如果有2个或者多个硬盘,如何判断每个硬盘是MBR还是GTP?
作者: ygqiang    时间: 2015-1-2 19:44

试试这样合并:
DAIC 发表于 2015-1-2 18:49



    rem 判定是否是GPT磁盘。
这个bat代码,只能判定1个硬盘的情况。

如果有2个或者多个,就不行了。
作者: DAIC    时间: 2015-1-2 20:03

回复 8# ygqiang


    先不管多个硬盘的事情,试试合并之后能否正常执行吧。
作者: yu2n    时间: 2015-1-2 20:18

回复 5# ygqiang

检查多个硬盘是不是GPT分区,我这里不方便测试,请自行测试:
  1. @echo off
  2. for /f "tokens=1,2,* delims= " %%a in ('echo list disk^|diskpart^|find /i "B"') do (
  3.   (echo,%%c|find /i "*" >nul 2>nul) && (
  4.      echo %%a %%b 是GPT分区
  5.   ) || (
  6.      echo %%a %%b 不是GPT分区
  7.   )
  8. )
  9. pause
复制代码

作者: ygqiang    时间: 2015-1-2 20:41

回复  ygqiang


    先不管多个硬盘的事情,试试合并之后能否正常执行吧。
DAIC 发表于 2015-1-2 20:03



合并之后,能正常执行的。。
作者: ygqiang    时间: 2015-1-2 20:45

回复  ygqiang

检查多个硬盘是不是GPT分区,我这里不方便测试,请自行测试:
yu2n 发表于 2015-1-2 20:18



   
多谢。这个测试过了。可以。

显示如下:
磁盘0  不是GPT分区  这个是系统盘  东芝ssd 64g
磁盘1  不是GPT分区  这个是数据盘  东芝1T
磁盘2  不是GPT分区  这个是u盘    16G
作者: ygqiang    时间: 2015-1-2 20:47

回复  ygqiang

检查多个硬盘是不是GPT分区,我这里不方便测试,请自行测试:
yu2n 发表于 2015-1-2 20:18



    1楼的2个bat代码。

第2个bat 。测试结果如下:
作者: yiwuyun    时间: 2015-1-2 22:12

用查找方法是有缺陷的,因为GPT前面还有一项是DYN,如果DYN是*,就会出错,所以我当时用B作为分隔符,而不是空格。并且我测试过恰好是8个字符。用一个变量,很容易把我写的代码扩展到多个硬盘。每循环一次,变量增1,不跳出循环.我写这个代码是在WINPE下用的,所以全是纯批并且不用其他在WINPE下用不起的工具。
作者: ygqiang    时间: 2015-1-2 22:35

用查找方法是有缺陷的,因为GPT前面还有一项是DYN,如果DYN是*,就会出错,所以我当时用B作为分隔 ...
yiwuyun 发表于 2015-1-2 22:12



    多谢。。。能否帮忙合并解决下1楼的2个bat代码?
作者: yu2n    时间: 2015-1-3 07:21

本帖最后由 yu2n 于 2015-1-7 12:23 编辑

Windows XP 的 DiskPart 命令有 BUG ? 我在虚拟机建立了一块硬盘(Disk 1),分区表为 GPT,用PAProCn、DiskGenius 都可以识别为 GPT 分区表,但是 DiskPart 命令识别不出来:
  1. C:\Documents and Settings\Yu2n>ver
  2. Microsoft Windows XP [Version 5.1.2600]
  3. C:\Documents and Settings\Yu2n>diskpart
  4. Microsoft DiskPart version 5.1.3565
  5. Copyright (C) 1999-2003 Microsoft Corporation.
  6. On computer: PC-02
  7. DISKPART> list disk
  8.   Disk ###  Status      Size     Free     Dyn  Gpt
  9.   --------  ----------  -------  -------  ---  ---
  10.   Disk 0    Online        20 GB      0 B
  11.   Disk 1    Online        10 GB      0 B
  12.   Disk 2    Online       500 GB      0 B
  13. DISKPART>
复制代码
因为 DiskPart 不能正常工作,到此为止了……放个VBS代码上来,请自行测试吧:
2015.1.7 更新:感谢 apang 提醒 65 行 GetSize 少了个 S ,现已补上,谢谢。
  1. RunAsAdmin
  2. Main
  3. Sub Main()
  4.   Dim objWMI, colDisks
  5.   Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  6.   Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  7.   For Each objDisk in colDisks
  8.     s = s & "硬盘" & objDisk.Index & ":" & vbTab
  9.     s = s & "大小:" & GetSize(objDisk.Size) & vbTab
  10.     s = s & "型号:" & objDisk.Caption & vbTab
  11.     s = s & "分区表:" & IsGPT(objDisk.Index) & vbCrLf
  12.     strDiskID = Replace(objDisk.DeviceID, "\", "\\")
  13.     Set colPartitions = objWMI.ExecQuery _
  14.         ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
  15.         & " where AssocClass=Win32_DiskDriveToDiskPartition")
  16.     For Each objPartition in colPartitions
  17.       strPartId = objPartition.DeviceID
  18.       Set colLogicalDisks = objWMI.ExecQuery _
  19.           ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId & """}  where AssocClass=Win32_LogicalDiskToPartition")
  20.       For Each objLogicalDisk in colLogicalDisks
  21.         size = objLogicalDisk.Size
  22.         free = objLogicalDisk.Freespace
  23.         used = FormatNumber((size - free) / size * 100, 2, true) & "%"
  24.         s = s & "分区" & objLogicalDisk.DeviceID & vbTab
  25.         s = s & "大小:" & GetSize(size) & vbTab
  26.         s = s & "剩余:" & GetSize(free) & vbTab
  27.         s = s & "使用率:" & used & vbCrLf
  28.       Next
  29.     Next
  30.     s = s & vbCrLf
  31.   Next
  32.   WScript.Echo s
  33. End Sub
  34. ' 格式化
  35. Function GetSize(intSize)
  36.   If intSize/1024/1024 > 1024 Then
  37.     GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  38.   Else
  39.     GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  40.   End If
  41. End Function
  42. ' 获取指定硬盘的分区表类型(GPT/MBR)
  43. Function IsGPT(ByVal nDiskIndex)
  44.   IsGPT = "MBR"   'XP 不支持diskpart 识别GPT,默认MBR。感谢 freesoft00 提醒。
  45.   Dim wso, sLogFile, sText
  46.   Set wso = CreateObject("WScript.Shell")
  47.   sLogFile = wso.ExpandenVironmentStrings("%temp%\diskpart.log")
  48.   wso.Run "cmd /c ""chcp 437 & cls & (echo list disk | diskpart | find /i ""Disk " & nDiskIndex & """) >""" & sLogFile & """ "" ", 0, False
  49.   Call TxtFile(sLogFile, 1, -2, sText)
  50.   If Trim(Right(sText,3)) = "*" Then IsGPT = "GPT"
  51. End Function
  52. ' 对文本指定编码进行读写操作2
  53. 'nRW: 1只读, 2只写, 8追加 'nCharset: -2(系统), -1(Unicode), 0(ASCII)
  54. Sub TxtFile(ByVal FileName, ByVal nRW, ByVal nCharset, ByRef sText)
  55.   Dim fso :  Set fso = CreateObject("Scripting.filesystemobject")
  56.   If sText <> "" And (nRW = 2 Or nRW = 8) Then
  57.     fso.OpenTextFile(FileName, nRW, True, nCharset).Write sText
  58.   ElseIf fso.FileExists(FileName) And nRW = 1 Then
  59.     If fso.GetFile(FileName).Size > 0 Then _
  60.       sText = fso.OpenTextFile(FileName, nRW, False, nCharset).ReadAll
  61.   End If
  62. End Sub
  63. ' 以管理员身份运行
  64. Sub RunAsAdmin()
  65.   Dim objItems, objItem, strVer, nVer
  66.   Set objItems = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
  67.   For Each objItem In objItems
  68.     strVer = objItem.Version
  69.   Next
  70.   nVer = Split(strVer, ".")(0) & Split(strVer, ".")(1)
  71.   If nVer >= 60 Then
  72.     Dim oShell, oArg, strArgs
  73.     Set oShell = CreateObject("Shell.Application")
  74.     If Not WScript.Arguments.Named.Exists("ADMIN") Then
  75.       For Each oArg In WScript.Arguments
  76.         strArgs = strArgs & " """ & oArg & """"
  77.       Next
  78.       strArgs = strArgs & " /ADMIN:1"
  79.       Call oShell.ShellExecute("WScript.exe", """" & WScript.ScriptFullName & """" & strArgs, "", "runas", 1)
  80.       Set oShell = Nothing
  81.       WScript.Quit(0)
  82.     End If
  83.     Set oShell = Nothing
  84.   End If
  85. End Sub
复制代码

作者: ygqiang    时间: 2015-1-3 09:23

Windows XP 的 DiskPart 命令有 BUG ? 我在虚拟机建立了一块硬盘(Disk 1),分区表为 GPT,用PAProCn、Di ...
yu2n 发表于 2015-1-3 07:21


多谢了。。测试结果可以。不过是弹出窗口,需要用鼠标点击下“确定”按钮。

能否将vbs的结果 输出到txt文件里面
这个我就可以在bat里面显示txt的内容了



start c:\diskinfo.vbs
ping 127.0.0.1 -n 5 >nul 2>nul
cls
type c:\diskinfo.txt
作者: czjt1234    时间: 2015-1-3 10:08

批处理改为

cscript /nologo c:\diskinfo.vbs
pause
作者: ygqiang    时间: 2015-1-3 12:01

本帖最后由 ygqiang 于 2015-1-3 12:19 编辑
批处理改为

cscript /nologo c:\diskinfo.vbs
pause
czjt1234 发表于 2015-1-3 10:08



    多谢

能否修改下16楼的vbs代码,   让vbs生成结果放到txt里面

这样bat里面可以直接显示出txt里面的结果
作者: ygqiang    时间: 2015-1-3 12:17

去掉这个弹出窗口,将结果保存到txt文件里面
作者: freesoft00    时间: 2015-1-3 13:29

回复 16# yu2n


    xp系统不支持gpt分区,只有2003以上的系统才支持,可以加一个判断,如果当前系统是xp系统就不判断gpt,直接就是mbr格式的。
作者: apang    时间: 2015-1-7 11:42

顶楼代码第65行有一处笔误,Getize 应该为 GetSize
作者: ygqiang    时间: 2015-1-7 15:59

本帖最后由 ygqiang 于 2016-9-8 12:48 编辑

硬盘-格式及分区检测DynamicScript-修正版
  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
复制代码





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