newswan 发表于 2018-5-25 17:35:43

怎么获得 磁盘 和 卷 的对应关系

本帖最后由 newswan 于 2018-6-2 12:13 编辑

wmic DISKDRIVE

Name=\\.\PHYSICALDRIVE1
Partitions=3

wmic LOGICALDISK

Name=M:
VolumeName=U3

那么,怎么得到 磁盘 和 卷 的对应关系,wmic 可以吗?

使用 diskpart 的批处理,最后结果。

plusv 发表于 2018-5-27 05:58:44

本帖最后由 plusv 于 2018-5-27 06:01 编辑

获得 磁盘 和 卷 的对应关系

attach://371782.zip



newswan 发表于 2018-5-29 04:51:18

本帖最后由 newswan 于 2018-5-29 04:59 编辑

ok,谢谢
但是在我这里报错,win10
用 diskpart 太麻烦了
另外,没有盘符的分区,能显示么?例如 efi msr 或 其他隐藏的分区。

.\Test.ps1 : File C:\Users\admin\Desktop\Test.ps1 cannot be loaded because running scripts is disabled on this system.
For more information, see about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\Test.ps1
+ ~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

PS C:\windows\system32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14393.2273
PSEdition                      Desktop
PSCompatibleVersions         {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14393.2273
CLRVersion                     4.0.30319.42000
WSManStackVersion            3.0
PSRemotingProtocolVersion      2.3
SerializationVersion         1.1.0.1

nttwqz 发表于 2018-5-29 09:17:43

wmic volume get caption,deviceid

或者

mountvol

dos时代菜鸟 发表于 2018-5-29 10:17:25

vbs调用 wimc

dos时代菜鸟 发表于 2018-5-29 13:13:13

本帖最后由 dos时代菜鸟 于 2018-5-29 14:22 编辑



如果用select 可能更简便一些,另外 cmd 下也应该可以实现。


vbs


'获取 磁盘以及其分区列表,包括接口信息。
'通过 DiskDrive 获取硬盘 index
'通过 win32_LogicalDiskToPartition 获取分区盘符(C: D: E:...) 和分区位置(disk n#,partition m#)
'通过 win32_LogicalDisk 获取分区盘符 和 分区大小,卷标,格式等
'通过 Diskpartition 做中间索引,可获取 分区所在硬盘的 index 以及分区位置
   
Set wmi=GetObject("winmgmts:\\.\root\cimv2")
Set d_s=wmi.instancesof("win32_diskdrive")
Set p_s1=wmi.instancesof("win32_LogicalDiskToPartition")
Set p_s2=wmi.instancesof("win32_LogicalDisk")
Set p_s3=wmi.instancesof("Win32_DiskPartition")

l="----------------------------------------------------------------------------------"
snx=l
For Each d In d_s
      snx=snx & Chr(10)&d.deviceId &""& d.interfacetype &Right("    "&Int(d.size/1073741824),6) &" Gb" _
                                 & "   "&d.Model
      For Each p3 In p_s3
                If d.index=p3.diskindex Then
                        For Each p1 In p_s1
                              p1_1=replace(Split(p1.Antecedent,"=",-1,1)(1),chr(34),"") '获取分区位置,Disk_n#Partition_m#
                              p1_2=replace(Split(p1.dependent,"=",-1,1)(1),chr(34),"")'获取盘符
                              If p1_1=p3.deviceid Then
                                        sn=""
                                        For Each p2 In p_s2
                                                If p2.deviceid=p1_2 Then
                                                      sn="   "& p2.deviceid & " " _
                                                      & Left(p2.volumename&"         ",11) _
                                                      & Left(p2.filesystem&"   ",6) _
                                                      & Right("    "&Int(p2.size/1073741824),6) &" Gb" _
                                                      & "    ("& d.deviceId&","&p3.index &")"
                                                End If
                                        Next
                                        snx=snx &Chr(10) & sn
                              End If
                        Next               
                End if
      Next
snx=snx&chr(10)&l
Next
WScript.Echo snx




dos时代菜鸟 发表于 2018-5-29 15:36:10

dos时代菜鸟 发表于 2018-5-29 13:13
如果用select 可能更简便一些,另外 cmd 下也应该可以实现。




wimc 中 没有 Win32_DiskPartition 的别名定义,不知道怎么创建。

plusv 发表于 2018-5-29 18:21:27

To:newswan

Q:>但是在我这里报错,win10
A:PowerShell Set-ExecutionPolicy UnRestricted

>用 diskpart 太麻烦了
A:这不是 DiskPart

>另外,没有盘符的分区,能显示么?例如 efi msr 或 其他隐藏的分区。
A:如附图,改一列.


newswan 发表于 2018-5-30 11:10:54

本帖最后由 newswan 于 2018-5-30 11:24 编辑

用了一个vhd磁盘测试,
分区是这样的:


Test.ps1


HD3.1.VBS


都没有显示出没有盘符的卷

dos时代菜鸟 发表于 2018-5-30 18:41:38

本帖最后由 dos时代菜鸟 于 2018-5-30 20:56 编辑

看脚本内容就知道了,我那个本来就是只显示分配盘符的分区。

稍微修改 是可以显示 没有盘符的 分区的,但是也 仅仅能够知道 该分区 所在的硬盘 位置,其他的什么大小,卷标,格式类型也都 无法获取。


用 diskpart 也不麻烦 可以看 http://wuyou.net/forum.php?mod=viewthread&tid=404993&fromuid=1198

plusv 发表于 2018-5-30 21:03:49

我也觉的用 DiskPart 才是好方法.

newswan 发表于 2018-5-30 22:52:39

dos时代菜鸟 发表于 2018-5-30 18:41
看脚本内容就知道了,我那个本来就是只显示分配盘符的分区。

稍微修改 是可以显示 没有盘符的 分区的, ...

谢谢

dos时代菜鸟 发表于 2018-5-30 23:15:26

本帖最后由 dos时代菜鸟 于 2018-5-30 23:47 编辑

唉,记得以前弄过 类似的脚本 ,再 弄一次吧。
利用 diskpart 实现的。
英文diskpart 也应该适用。因为 没有 用到 中文关键字作为 文本流 参照标记。否则 脚本 编辑会更 简洁。





@echo off
setlocal ENABLEDELAYEDEXPANSION
color 1f
mode con:cols=130 LINES=20
title 获取硬盘分区序列.....

CLS
echo ....正在生成硬盘和各卷信息列表.....
set l0=
>%temp%\part_0.txt echo.
>%temp%\temp.txt echo list disk
for /f "tokens=1,2,3" %%c in ('diskpart /s %temp%\temp.txt') do (
        set disk=%%d
        if "%%c"=="*" set disk=%%e
        if "!disk:~0,1!"=="-" set l0=ok
        if not "!disk:~0,1!"=="-" (if /i "!l0!"=="ok" (
                echo 正在分析 HD #!disk!
          (echo select disk !disk!
               echo detail disk)>%temp%\temp.txt
                set l1=
                for /f "tokens=2,*"%%f in ('diskpart /s %temp%\temp.txt') do (
                        set part=%%g
                        if "!part:~0,1!"=="-" set l1=ok
                        if not "!part:~0,1!"=="-" (if /i "!l1!"=="ok" (
      if not "!part:~1,1!"==" " set "part=*                     !part!"
      echo .找到 Vol#%%f
      (echo select disk !disk!
                     echo select vol %%f
                     echo list part)>%temp%\temp.txt
                  set "sp=*"
                  for /f "tokens=1,3" %%i in ('diskpart /s %temp%\temp.txt') do (if "%%i"=="*" set sp=%%j)
      echo %%f    !disk!:!sp!   !part! >>%temp%\part_0.txt
                        ))
                )
        ))
)

cls
echo --------------------------------------------
echoVOLHD:PLTR格式大小      标签
echo ----- ----- -------- -------------------
for /f "tokens=1,2,*" %%o in (%temp%\part_0.txt) do (
    set vol=%%o
    set hdp=%%p
    set l2=%%q
    set ltr=!l2:~0,1!
    set fmt=!l2:~17,5!
    set size=!l2:~36,8!
    set lable=!l2:~4,12!
    echo   !vol!    !hdp!   !ltr!   !fmt!!size! !lable!
)
echo -----------------------------------------------------
pause

newswan 发表于 2018-5-31 11:47:11

本帖最后由 newswan 于 2018-5-31 11:50 编辑

搞了几天,我想要的这样的,bat 弄起来太累了,语法不熟,又不好调试。。。。


@echo off
setlocal EnableDelayedExpansion

:C_listDiskVolume

echo,
(set diskID=)
(set cmdline=cmd /c "(set <nul /p=list disk)")
for /f "usebackq skip=7 tokens=*" %%i in (`%cmdline% ^| diskpart`) do (echo %%i)
echo,
for /f "usebackq skip=9 tokens=2" %%i in (`%cmdline% ^| diskpart`) do (
    (set diskID=%%i)
    if "!diskID!" NEQ "" (
      (set begin2=)
      (set cmdline=cmd /c "echo sel disk !diskID! & (set <nul /p=detail disk)")
      (set /a count1=0)
      for /f "usebackq tokens=* skip=10 delims=" %%i in (`!cmdline! ^| diskpart`) do (
            (set /a count1+=1)
            if "!count1!"=="1" echo %%i
      )
      (set count1=)
      (set cmdline=cmd /c "echo sel disk !diskID! & (set <nul /p=list part)")
      for /f "usebackq tokens=* delims=" %%i in (`!cmdline! ^| diskpart`) do (
            (echo "%%i" | find /i "###" >nul) && (set begin2=T) && (set /a count2=0)
            if defined begin2 (
                (set /a count2+=1)
                if !count2!==1 (set line2=.%%i ) else (set line2=.%%i)
                if !count2! LEQ 3 (
                  (set cmdline=cmd /c "echo sel disk 0 & echo sel part 1 & (set <nul /p=detail part)")
                  for /f "usebackq tokens=* delims=" %%i in (`!cmdline! ^| diskpart`) do (
                        (echo "%%i" | find /i "###" >nul) && (set begin3=T) && (set /a count3=0)
                        if defined begin3 (
                            (set /a count3+=1)
                            if !count2!==!count3! (set line3=%%i)
                        )
                  )
                )
                (set begin3=)
                (set count3=)
                if !count2! GTR 2 (
                  for /f "tokens=3" %%i in ("!line2!") do set partID=%%i
                  (set cmdline=cmd /c "echo sel disk !diskID! & echo sel part !partID! & (set <nul /p=detail part)")
                  for /f "usebackq tokens=* delims=" %%i in (`!cmdline! ^| diskpart`) do (
                        (echo "%%i" | find /i "###" >nul) && (set begin3=T) && (set /a count3=0)
                        if defined begin3 (
                            (set /a count3+=1)
                            if !count3!==3 (set line3=%%i)
                        )
                  )
                )
                set <nul /p=!line2! & if defined line3 (echo !line3:~,38!!line3:~50!) else (echo,)
                (set begin3=)
                (set count3=)
                (set line3=)
            )
            (set line2=)
      )
      (set begin2=)
      (set count2=)
      echo,
    )
)
(set diskID=)
(set cmdline=)
(set rowcount=)
goto :eof

dos时代菜鸟 发表于 2018-5-31 21:59:34

本帖最后由 dos时代菜鸟 于 2018-5-31 22:28 编辑

newswan 发表于 2018-5-31 11:47
搞了几天,我想要的这样的,bat 弄起来太累了,语法不熟,又不好调试。。。。
我基本上明白你的意思了

看这个吧 ,运行效率 有点儿低,因为要频繁调用 diskpart 对每一个分区进行 探测。

hd3y2.cmd
@echo off
setlocal ENABLEDELAYEDEXPANSION
color 1f
mode con:cols=150 LINES=30
title 获取硬盘分区序列.....

set "s1=磁盘"
set "s2=分区"
set "s3=卷"

CLS
echo.

>%temp%\part_0.txt echo.
>%temp%\diskpart.s echo list disk
set /a No=0
echo                           硬盘分区序列
echo --------------------------------------------------------------------------------------------------
echoNo.VolHD:P   LTR格式   大小      标签          类型_状态_信息_偏移

for /f "tokens=1,2,3,4,5" %%a in ('diskpart /s %temp%\diskpart.s') do (
if "%%a"=="!s1!" (if not "%%b"=="###" (
    set "disk=%%b"
    (
      echo select disk !disk!
      echo detail disk
      echo list part
    )>%temp%\diskpart.s
    set /a Nod=0
    for /f "delims=" %%u in ('diskpart /s %temp%\diskpart.s') do (
      set /a Nod+=1
      if !Nod! equ 5(
      echo--------------------------------------------------------------- Disk#%%b %%d%%e %%c(%%~u)
      )
      for /f "tokens=1,2,3,4,5,6,7" %%e in ("%%~u") do (
      set "size=      %%h %%i"
      if "%%e"=="!s2!" (if not "%%f"=="###" (
          (
            echo select disk !disk!
            echo select part %%f
            echo list vol
          )>%temp%\diskpart.s
          set "lv0="
          for /f "tokens=1,2,*" %%l in ('diskpart /s %temp%\diskpart.s') do (
            if "%%l"=="*" ( if "%%m"=="!s3!"set "lv0=%%n" )
          )
          set /a No+=1
          set "No1=!No!"
          set hdp=!disk!:%%f
          set size=!size:~-8!
          if not "!lv0!"==""(
            for /f "tokens=1" %%r in ("!lv0!") do (set "vol=%%r")
            set ltr=!lv0:~6,1!
            if "!ltr!"==" " set ltr=*
            set fmt=!lv0:~23,5!
            set lable=!lv0:~10,12!
            for /f "tokens=1,2" %%r in ("!lv0:~51!") do (set other=%%r_%%s)
            echo!No1:~-3!!vol:~-3!   !hdp!    !ltr!   !fmt!!size!!lable!%%g_!other! %%j%%k
          ) else (
            echo!No1:~-3!    *   !hdp!               !size!                %%g_ %%j%%k
          )
      ))
      )
   )
))
)
echo --------------------------------------------------------------------------------------------------
pause

1,获取硬盘列表
2,获取每个硬盘分区列表
3,获取分区对应的 卷信息,卷标,格式,信息,状态。。。。
4,将掌握的 各个分区信息 显示出来。

本来windows 不支持的 分区,也要把信息 弄一下,这样就影响效率了。

newswan 发表于 2018-5-31 23:30:54

dos时代菜鸟 发表于 2018-5-31 21:59
我基本上明白你的意思了

看这个吧 ,运行效率 有点儿低,因为要频繁调用 diskpart 对每一个分区进行 探 ...

差不多,就是这样了。{:1_195:}
字符串截取太麻烦了
页: [1]
查看完整版本: 怎么获得 磁盘 和 卷 的对应关系