返回列表 发帖

[系统相关] [已解决]引导方式-分区表类型-空间占用-接口协议

本帖最后由 ygqiang 于 2025-2-13 22:05 编辑

[已解决]引导方式-分区表类型-空间占用-接口协议
请直接看6楼代码

磁盘分区容量-类型分析,gpt类型判断为mbr,如何修改?
win10系统,磁盘0为mbr,磁盘1为gpt。
bat文件编码保存为ANSI,运行代码后,分区表类型均显示mbr
@echo off
echo ——————————————————————————————————————— >nul 2>nul
if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (
    more +%%i "%~f0" > c:\diskinfo.vbs
)
ping 127.0.0.1 -n 2 >nul 2>nul
cls
cscript /nologo c:\diskinfo.vbs
ping 127.0.0.1 -n 2 >nul 2>nul
CScript /NoLogo c:\diskinfo.vbs>c:\diskinfo.txt
ping 127.0.0.1 -n 2 >nul 2>nul
cls
Type c:\diskinfo.txt
ping 127.0.0.1 -n 15 >nul 2>nul & if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
echo ——————————————————————————————————————— >nul 2>nul
if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
set "vbs=c:\diskinfo.vbs"
set "log=c:\diskinfo.log"
for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (more +%%i "%~f0" > "%vbs%")
CScript //NoLogo "%vbs%" > "%log%"
cls
type "%log%"
ping 127.0.0.1 -n 5 >nul 2>nul & if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul) & exit/b
goto :eof
echo ——————————————————————————————————————— >nul 2>nul
:DynamicScript
Main
Sub Main()
  Dim objWMI, colDisks
  Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  ' 获取硬盘最大序号
  nIndexMax = 0
  For Each objDisk in colDisks
    If Cint(objDisk.Index) > nIndexMax Then nIndexMax = Cint(objDisk.Index)
  Next
  ' 按序号取信息
  For i = 0 To nIndexMax
    For Each objDisk in colDisks
      ' 只取该序号信息
      If objDisk.Index = i Then
        s = s & "硬盘" & objDisk.Index & ":" & vbTab
        s = s & "大小:" & GetSize(objDisk.Size) & vbTab
        s = s & "型号:" & objDisk.Caption & vbTab
        s = s & "分区表:" & IsGPT(objDisk.Index) & vbCrLf
        strDiskID = Replace(objDisk.DeviceID, "\", "\\")
        Set colPartitions = objWMI.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
            & " where AssocClass=Win32_DiskDriveToDiskPartition")
        For Each objPartition in colPartitions
          strPartId = objPartition.DeviceID
          Set colLogicalDisks = objWMI.ExecQuery _
              ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId _
              & """}  where AssocClass=Win32_LogicalDiskToPartition")
          For Each objLogicalDisk in colLogicalDisks
            size = objLogicalDisk.Size
            free = objLogicalDisk.Freespace
            used = FormatNumber((size - free) / size * 100, 2, true) & "%"
            s = s & "分区" & objLogicalDisk.DeviceID & vbTab
            s = s & "大小:" & GetSize(size) & vbTab
            s = s & "剩余:" & GetSize(free) & vbTab
            s = s & "使用率:" & used & vbCrLf
          Next
        Next
        s = s & vbCrLf
      End If
    Next
  Next
  WScript.Echo s
End Sub
' 格式化
Function GetSize(intSize)
  If intSize/1024/1024 > 1024 Then
    GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  Else
    GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  End If
End Function
' 获取指定硬盘的分区表类型(GPT/MBR)
Function IsGPT(ByVal nDiskIndex)
  IsGPT = "MBR"
  Dim wso, sLogFile, sText
  Set wso = CreateObject("WScript.Shell")
  sLogFile = wso.ExpandenVironmentStrings("%temp%\diskpart.log")
  wso.Run "cmd /c ""chcp 437 & cls & (echo list disk | diskpart | find /i ""Disk " & nDiskIndex & """) >""" & sLogFile & """ "" ", 0, False
  Call TxtFile(sLogFile, 1, -2, sText)
  If Trim(Right(sText,3)) = "*" Then IsGPT = "GPT"
End Function
' 对文本指定编码进行读写操作2
'nRW: 1只读, 2只写, 8追加 'nCharset: -2(系统), -1(Unicode), 0(ASCII)
Sub TxtFile(ByVal FileName, ByVal nRW, ByVal nCharset, ByRef sText)
  Dim fso :  Set fso = CreateObject("Scripting.filesystemobject")
  If sText <> "" And (nRW = 2 Or nRW = 8) Then
    fso.OpenTextFile(FileName, nRW, True, nCharset).Write sText
  ElseIf fso.FileExists(FileName) And nRW = 1 Then
    If fso.GetFile(FileName).Size > 0 Then _
      sText = fso.OpenTextFile(FileName, nRW, False, nCharset).ReadAll
  End If
End Sub
' 以管理员身份运行
Sub RunAsAdmin()
  Dim objItems, objItem, strVer, nVer
  Set objItems = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
  For Each objItem In objItems
    strVer = objItem.Version
  Next
  nVer = Split(strVer, ".")(0) & Split(strVer, ".")(1)
  If nVer >= 60 Then
    Dim oShell, oArg, strArgs
    Set oShell = CreateObject("Shell.Application")
    If Not WScript.Arguments.Named.Exists("ADMIN") Then
      For Each oArg In WScript.Arguments
        strArgs = strArgs & " """ & oArg & """"
      Next
      strArgs = strArgs & " /ADMIN:1"
      Call oShell.ShellExecute("WScript.exe", """" & WScript.ScriptFullName & """" & strArgs, "", "runas", 1)
      Set oShell = Nothing
      WScript.Quit(0)
    End If
    Set oShell = Nothing
  End If
End SubCOPY

powershell –NoProfile –ExecutionPolicy Bypass "Get-Disk"COPY
bat文件里面,以上命令可以显示正常的GPT和MBR

TOP

TOP

本帖最后由 aloha20200628 于 2025-2-13 11:45 编辑

回复 2# ygqiang

用 powershell/vbs/jscript/wmic/... 等方法均可获取硬盘数据,比较而言,走 powershell 之道要慢一些,但要获取硬盘分区类型 MBR/GPT 数据还是 powershell 句式最简洁,以下给一个示例脚本,先完成自启提权窗口再来获取 MBR/GPT 数据,代码存为 test.bat 运行...
@echo off
%~1 powershell "start -file '%~f0' -arg '::' -verb runas" &exit/b
echo,...正在获取本地和外接硬盘数据...
powershell "get-disk|%%{''+$_.number+' '+[math]::round($_.size/1tb,1)+'TB '+$_.partitionStyle+' '+$_.FriendlyName}"|sort
pause&exit/bCOPY

TOP

回复 4# aloha20200628


    谢谢。
@echo off & setlocal enabledelayedexpansion
echo 代码开始
cls
echo ------------系统引导方式:
powershell –NoProfile –ExecutionPolicy Bypass "$env:Firmware_Type"
echo.
echo.
echo ------------硬盘格式::
powershell –NoProfile –ExecutionPolicy Bypass "Get-Disk"
pause >nul
exitCOPY

TOP

本帖最后由 ygqiang 于 2025-2-13 22:11 编辑

已解决,接近完美的代码。引导方式-分区表类型-空间占用-接口协议
@echo off & setlocal enabledelayedexpansion
echo 代码开始
cls
echo ——————————————————————————————————————— >nul 2>nul
if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (
    more +%%i "%~f0" > c:\diskinfo.vbs
)
ping 127.0.0.1 -n 2 >nul 2>nul
cls
echo ------------系统引导方式:
powershell –NoProfile –ExecutionPolicy Bypass "$env:Firmware_Type"
echo.
echo ------------硬盘分区表类型::
powershell "get-disk|%%{''+'     '+$_.number+' '+'    '+$_.partitionStyle+'   '+$_.FriendlyName}"|sort
echo.
echo ------------硬盘空间占用::
cscript /nologo c:\diskinfo.vbs
echo ------------硬盘接口协议::
echo.           协议   机械/固态    接口
set "_NVMe=NVMe====SSD    ::::::m.2"
set "_USB=USB"
set "_SATA=SATA====HDD/SSD::::::SATA-MSATA-m.2"
for /f "tokens=2,4,5" %%a in ('"echo list disk|diskpart|findstr /irc:"磁盘  *[0-9]""') do (
     for /f "tokens=3" %%i in ('"(echo sel disk %%a & echo detail disk & echo list part)|diskpart|findstr /irc:"类型  *:""') do (
          if defined _%%i echo       %%a:   !_%%i!           %%b %%c
     )
)
pause >nul
if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
exit
CScript /NoLogo c:\diskinfo.vbs>c:\diskinfo.txt
ping 127.0.0.1 -n 2 >nul 2>nul
cls
Type c:\diskinfo.txt
echo ——————————————————————————————————————— >nul 2>nul
if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul)
set "vbs=c:\diskinfo.vbs"
set "log=c:\diskinfo.log"
for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (more +%%i "%~f0" > "%vbs%")
CScript //NoLogo "%vbs%" > "%log%"
cls
type "%log%"
ping 127.0.0.1 -n 5 >nul 2>nul & if exist "c:\diskinfo.*" (del /q "c:\diskinfo.*" >nul 2>nul) & exit/b
goto :eof
echo ——————————————————————————————————————— >nul 2>nul
:DynamicScript
Main
Sub Main()
  Dim objWMI, colDisks
  Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  Set colDisks = objWMI.ExecQuery("select * from Win32_DiskDrive where MediaType like 'fixed%'")
  ' 获取硬盘最大序号
  nIndexMax = 0
  For Each objDisk in colDisks
    If Cint(objDisk.Index) > nIndexMax Then nIndexMax = Cint(objDisk.Index)
  Next
  ' 按序号取信息
  For i = 0 To nIndexMax
    For Each objDisk in colDisks
      ' 只取该序号信息
      If objDisk.Index = i Then
        s = s & "硬盘" & objDisk.Index & ":" & vbTab
        s = s & "大小:" & GetSize(objDisk.Size) & vbTab
        s = s & "型号:" & objDisk.Caption &  vbCrLf
        's = s & "型号:" & objDisk.Caption & vbTab
        's = s & "分区表:" & IsGPT(objDisk.Index) & vbCrLf
        strDiskID = Replace(objDisk.DeviceID, "\", "\\")
        Set colPartitions = objWMI.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDiskID & """}" _
            & " where AssocClass=Win32_DiskDriveToDiskPartition")
        For Each objPartition in colPartitions
          strPartId = objPartition.DeviceID
          Set colLogicalDisks = objWMI.ExecQuery _
              ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & strPartId _
              & """}  where AssocClass=Win32_LogicalDiskToPartition")
          For Each objLogicalDisk in colLogicalDisks
            size = objLogicalDisk.Size
            free = objLogicalDisk.Freespace
            used = FormatNumber((size - free) / size * 100, 2, true) & "%"
            s = s & "分区" & objLogicalDisk.DeviceID & vbTab
            s = s & "大小:" & GetSize(size) & vbTab
            s = s & "剩余:" & GetSize(free) & vbTab
            s = s & "使用率:" & used & vbCrLf
          Next
        Next
        s = s & vbCrLf
      End If
    Next
  Next
  WScript.Echo s
End Sub
' 格式化
Function GetSize(intSize)
  If intSize/1024/1024 > 1024 Then
    GetSize = FormatNumber(intSize/1024/1024/1024, 2, true) & "GB"
  Else
    GetSize = FormatNumber(intSize/1024/1024, 2, true) & "MB"
  End If
End Function
' 获取指定硬盘的分区表类型(GPT/MBR)
Function IsGPT(ByVal nDiskIndex)
  IsGPT = "MBR"
  Dim wso, sLogFile, sText
  Set wso = CreateObject("WScript.Shell")
  sLogFile = wso.ExpandenVironmentStrings("%temp%\diskpart.log")
  wso.Run "cmd /c ""chcp 437 & cls & (echo list disk | diskpart | find /i ""Disk " & nDiskIndex & """) >""" & sLogFile & """ "" ", 0, False
  Call TxtFile(sLogFile, 1, -2, sText)
  If Trim(Right(sText,3)) = "*" Then IsGPT = "GPT"
End Function
' 对文本指定编码进行读写操作2
'nRW: 1只读, 2只写, 8追加 'nCharset: -2(系统), -1(Unicode), 0(ASCII)
Sub TxtFile(ByVal FileName, ByVal nRW, ByVal nCharset, ByRef sText)
  Dim fso :  Set fso = CreateObject("Scripting.filesystemobject")
  If sText <> "" And (nRW = 2 Or nRW = 8) Then
    fso.OpenTextFile(FileName, nRW, True, nCharset).Write sText
  ElseIf fso.FileExists(FileName) And nRW = 1 Then
    If fso.GetFile(FileName).Size > 0 Then _
      sText = fso.OpenTextFile(FileName, nRW, False, nCharset).ReadAll
  End If
End Sub
' 以管理员身份运行
Sub RunAsAdmin()
  Dim objItems, objItem, strVer, nVer
  Set objItems = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
  For Each objItem In objItems
    strVer = objItem.Version
  Next
  nVer = Split(strVer, ".")(0) & Split(strVer, ".")(1)
  If nVer >= 60 Then
    Dim oShell, oArg, strArgs
    Set oShell = CreateObject("Shell.Application")
    If Not WScript.Arguments.Named.Exists("ADMIN") Then
      For Each oArg In WScript.Arguments
        strArgs = strArgs & " """ & oArg & """"
      Next
      strArgs = strArgs & " /ADMIN:1"
      Call oShell.ShellExecute("WScript.exe", """" & WScript.ScriptFullName & """" & strArgs, "", "runas", 1)
      Set oShell = Nothing
      WScript.Quit(0)
    End If
    Set oShell = Nothing
  End If
End SubCOPY

TOP

返回列表