无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 9684|回复: 15
打印 上一主题 下一主题

[求助] 怎么获得 磁盘 和 卷 的对应关系

[复制链接]
跳转到指定楼层
1#
发表于 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 的批处理,最后结果。 diskpartvol.rar (1.64 KB, 下载次数: 4)
2#
发表于 2018-5-27 05:58:44 | 只看该作者
本帖最后由 plusv 于 2018-5-27 06:01 编辑

获得 磁盘 和 卷 的对应关系

http://wuyou.net./forum.php?mod=attachment&aid=MzcxNzgyfDI3NTRkYjhkZDdjZDgzMGNhNTNiMzhjMzk2NzMxNDNifDE3MzIzNjg2Njc%3D&request=yes&_f=.zip



评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

3#
 楼主| 发表于 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

回复

使用道具 举报

4#
发表于 2018-5-29 09:17:43 来自手机 | 只看该作者
wmic volume get caption,deviceid

或者

mountvol
回复

使用道具 举报

5#
发表于 2018-5-29 10:17:25 | 只看该作者
vbs调用 wimc
回复

使用道具 举报

6#
发表于 2018-5-29 13:13:13 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-5-29 14:22 编辑

HD3.1.VBS.7z (855 Bytes, 下载次数: 10)

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


vbs


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

  12. l="----------------------------------------------------------------------------------"
  13. snx=l
  14. For Each d In d_s
  15.         snx=snx & Chr(10)&  d.deviceId &"  "& d.interfacetype &Right("    "&Int(d.size/1073741824),6) &" Gb" _
  16.                                  & "   "&d.Model
  17.         For Each p3 In p_s3
  18.                 If d.index=p3.diskindex Then
  19.                         For Each p1 In p_s1
  20.                                 p1_1=replace(Split(p1.Antecedent,"=",-1,1)(1),chr(34),"") '获取分区位置,Disk_n#Partition_m#
  21.                                 p1_2=replace(Split(p1.dependent,"=",-1,1)(1),chr(34),"")  '获取盘符
  22.                                 If p1_1=p3.deviceid Then
  23.                                         sn=""
  24.                                         For Each p2 In p_s2
  25.                                                 If p2.deviceid=p1_2 Then
  26.                                                         sn="   "& p2.deviceid & " " _
  27.                                                         & Left(p2.volumename&"         ",11) _
  28.                                                         & Left(p2.filesystem&"   ",6) _
  29.                                                         & Right("    "&Int(p2.size/1073741824),6) &" Gb" _
  30.                                                         & "    ("& d.deviceId&","&p3.index &")"
  31.                                                 End If
  32.                                         Next
  33.                                         snx=snx &Chr(10) & sn
  34.                                 End If
  35.                         Next               
  36.                 End if
  37.         Next
  38. snx=snx&chr(10)&l
  39. Next
  40. WScript.Echo snx
复制代码




点评

wimc 中 没有 Win32_DiskPartition 的别名定义,不知道怎么创建。  详情 回复 发表于 2018-5-29 15:36

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

7#
发表于 2018-5-29 15:36:10 | 只看该作者
dos时代菜鸟 发表于 2018-5-29 13:13
如果用  select 可能更简便一些,另外 cmd 下也应该可以实现。

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

使用道具 举报

8#
发表于 2018-5-29 18:21:27 | 只看该作者
To:newswan

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

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

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


回复

使用道具 举报

9#
 楼主| 发表于 2018-5-30 11:10:54 | 只看该作者
本帖最后由 newswan 于 2018-5-30 11:24 编辑

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


Test.ps1


HD3.1.VBS


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

使用道具 举报

10#
发表于 2018-5-30 18:41:38 来自手机 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-5-30 20:56 编辑

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

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


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

点评

谢谢  详情 回复 发表于 2018-5-30 22:52
回复

使用道具 举报

11#
发表于 2018-5-30 21:03:49 | 只看该作者
我也觉的用 DiskPart 才是好方法.
回复

使用道具 举报

12#
 楼主| 发表于 2018-5-30 22:52:39 | 只看该作者
dos时代菜鸟 发表于 2018-5-30 18:41
看脚本内容就知道了,我那个本来就是只显示分配盘符的分区。

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

谢谢
回复

使用道具 举报

13#
发表于 2018-5-30 23:15:26 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-5-30 23:47 编辑

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

hd3.2.cmd.7z (780 Bytes, 下载次数: 4)



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

  6.   CLS
  7.   echo ....正在生成硬盘和各卷信息列表.....
  8.   set l0=
  9.   >%temp%\part_0.txt echo.
  10.   >%temp%\temp.txt echo list disk
  11. for /f "tokens=1,2,3" %%c in ('diskpart /s %temp%\temp.txt') do (
  12.         set disk=%%d
  13.         if "%%c"=="*" set disk=%%e
  14.         if "!disk:~0,1!"=="-" set l0=ok
  15.         if not "!disk:~0,1!"=="-" (if /i "!l0!"=="ok" (
  16.                 echo 正在分析 HD #!disk!
  17.           (echo select disk !disk!  
  18.                  echo detail disk)>%temp%\temp.txt
  19.                 set l1=
  20.                 for /f "tokens=2,*"  %%f in ('diskpart /s %temp%\temp.txt') do (
  21.                         set part=%%g
  22.                         if "!part:~0,1!"=="-" set l1=ok
  23.                         if not "!part:~0,1!"=="-" (if /i "!l1!"=="ok" (
  24.         if not "!part:~1,1!"==" " set "part=*                       !part!"
  25.         echo .找到 Vol#%%f
  26.         (echo select disk !disk!  
  27.                      echo select vol %%f
  28.                      echo list part)>%temp%\temp.txt
  29.                     set "sp=*"
  30.                     for /f "tokens=1,3" %%i in ('diskpart /s %temp%\temp.txt') do (if "%%i"=="*" set sp=%%j)
  31.         echo %%f    !disk!:!sp!   !part! >>%temp%\part_0.txt
  32.                         ))
  33.                 )
  34.         ))
  35. )

  36.   cls
  37.   echo --------------------------------------------
  38.   echo  VOL  HD:P  LTR  格式  大小      标签
  39.   echo ----- ----- ---  ----- --------  -----------
  40.   for /f "tokens=1,2,*" %%o in (%temp%\part_0.txt) do (
  41.     set vol=%%o
  42.     set hdp=%%p
  43.     set l2=%%q
  44.     set ltr=!l2:~0,1!
  45.     set fmt=!l2:~17,5!
  46.     set size=!l2:~36,8!
  47.     set lable=!l2:~4,12!
  48.     echo   !vol!    !hdp!   !ltr!   !fmt!  !size! !lable!
  49.   )
  50.   echo -----------------------------------------------------
  51. pause
复制代码


评分

参与人数 1无忧币 +5 收起 理由
lbw2007 + 5 支持一下,很好用

查看全部评分

回复

使用道具 举报

14#
 楼主| 发表于 2018-5-31 11:47:11 | 只看该作者
本帖最后由 newswan 于 2018-5-31 11:50 编辑

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


  1. @echo off
  2. setlocal EnableDelayedExpansion

  3. :C_listDiskVolume

  4. echo,
  5. (set diskID=)
  6. (set cmdline=cmd /c "(set <nul /p=list disk)")
  7. for /f "usebackq skip=7 tokens=*" %%i in (`%cmdline% ^| diskpart`) do (echo %%i)
  8. echo,
  9. for /f "usebackq skip=9 tokens=2" %%i in (`%cmdline% ^| diskpart`) do (
  10.     (set diskID=%%i)
  11.     if "!diskID!" NEQ "" (
  12.         (set begin2=)
  13.         (set cmdline=cmd /c "echo sel disk !diskID! & (set <nul /p=detail disk)")
  14.         (set /a count1=0)
  15.         for /f "usebackq tokens=* skip=10 delims=" %%i in (`!cmdline! ^| diskpart`) do (
  16.             (set /a count1+=1)
  17.             if "!count1!"=="1" echo %%i
  18.         )
  19.         (set count1=)
  20.         (set cmdline=cmd /c "echo sel disk !diskID! & (set <nul /p=list part)")
  21.         for /f "usebackq tokens=* delims=" %%i in (`!cmdline! ^| diskpart`) do (
  22.             (echo "%%i" | find /i "###" >nul) && (set begin2=T) && (set /a count2=0)
  23.             if defined begin2 (
  24.                 (set /a count2+=1)
  25.                 if !count2!==1 (set line2=.%%i ) else (set line2=.%%i)
  26.                 if !count2! LEQ 3 (
  27.                     (set cmdline=cmd /c "echo sel disk 0 & echo sel part 1 & (set <nul /p=detail part)")
  28.                     for /f "usebackq tokens=* delims=" %%i in (`!cmdline! ^| diskpart`) do (
  29.                         (echo "%%i" | find /i "###" >nul) && (set begin3=T) && (set /a count3=0)
  30.                         if defined begin3 (
  31.                             (set /a count3+=1)
  32.                             if !count2!==!count3! (set line3=%%i)
  33.                         )
  34.                     )
  35.                 )
  36.                 (set begin3=)
  37.                 (set count3=)
  38.                 if !count2! GTR 2 (
  39.                     for /f "tokens=3" %%i in ("!line2!") do set partID=%%i
  40.                     (set cmdline=cmd /c "echo sel disk !diskID! & echo sel part !partID! & (set <nul /p=detail part)")
  41.                     for /f "usebackq tokens=* delims=" %%i in (`!cmdline! ^| diskpart`) do (
  42.                         (echo "%%i" | find /i "###" >nul) && (set begin3=T) && (set /a count3=0)
  43.                         if defined begin3 (
  44.                             (set /a count3+=1)
  45.                             if !count3!==3 (set line3=%%i)
  46.                         )
  47.                     )
  48.                 )
  49.                 set <nul /p=!line2! & if defined line3 (echo !line3:~,38!!line3:~50!) else (echo,)
  50.                 (set begin3=)
  51.                 (set count3=)
  52.                 (set line3=)
  53.             )
  54.             (set line2=)
  55.         )
  56.         (set begin2=)
  57.         (set count2=)
  58.         echo,
  59.     )
  60. )
  61. (set diskID=)
  62. (set cmdline=)
  63. (set rowcount=)
  64. goto :eof
复制代码

t3.rar (1.46 KB, 下载次数: 7)

点评

我基本上明白你的意思了 看这个吧 hd3y2.cmd  详情 回复 发表于 2018-5-31 21:59
回复

使用道具 举报

15#
发表于 2018-5-31 21:59:34 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-5-31 22:28 编辑
newswan 发表于 2018-5-31 11:47
搞了几天,我想要的这样的,bat 弄起来太累了,语法不熟,又不好调试。。。。

我基本上明白你的意思了

看这个吧 hd3y2.zip (960 Bytes, 下载次数: 2) ,运行效率 有点儿低,因为要频繁调用 diskpart 对每一个分区进行 探测。

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

  6. set "s1=磁盘"
  7. set "s2=分区"
  8. set "s3=卷"

  9.   CLS
  10.   echo.

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

  17. for /f "tokens=1,2,3,4,5" %%a in ('diskpart /s %temp%\diskpart.s') do (
  18.   if "%%a"=="!s1!" (if not "%%b"=="###" (
  19.     set "disk=%%b"
  20.     (
  21.       echo select disk !disk!
  22.       echo detail disk
  23.       echo list part
  24.     )>%temp%\diskpart.s
  25.     set /a Nod=0
  26.     for /f "delims=" %%u in ('diskpart /s %temp%\diskpart.s') do (
  27.       set /a Nod+=1
  28.       if !Nod! equ 5  (
  29.         echo  ---  ---  -----  ---  -----  --------  ------------  ------------------------ Disk#%%b %%d%%e %%c(%%~u)
  30.       )
  31.       for /f "tokens=1,2,3,4,5,6,7" %%e in ("%%~u") do (
  32.         set "size=      %%h %%i"
  33.         if "%%e"=="!s2!" (if not "%%f"=="###" (
  34.           (
  35.             echo select disk !disk!
  36.             echo select part %%f
  37.             echo list vol
  38.           )>%temp%\diskpart.s
  39.           set "lv0="
  40.           for /f "tokens=1,2,*" %%l in ('diskpart /s %temp%\diskpart.s') do (
  41.             if "%%l"=="*" ( if "%%m"=="!s3!"  set "lv0=%%n" )
  42.           )
  43.           set /a No+=1
  44.           set "No1=  !No!"
  45.           set hdp=!disk!:%%f
  46.           set size=!size:~-8!
  47.           if not "!lv0!"==""  (
  48.             for /f "tokens=1" %%r in ("!lv0!") do (set "vol=  %%r")
  49.             set ltr=!lv0:~6,1!
  50.             if "!ltr!"==" " set ltr=*
  51.             set fmt=!lv0:~23,5!
  52.             set lable=!lv0:~10,12!
  53.             for /f "tokens=1,2" %%r in ("!lv0:~51!") do (set other=%%r_%%s)
  54.             echo  !No1:~-3!  !vol:~-3!   !hdp!    !ltr!   !fmt!  !size!  !lable!  %%g_!other! %%j%%k
  55.           ) else (
  56.             echo  !No1:~-3!    *   !hdp!               !size!                %%g_ %%j%%k
  57.           )
  58.         ))
  59.       )
  60.      )
  61.   ))
  62. )
  63. echo --------------------------------------------------------------------------------------------------
  64. pause
复制代码


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

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

点评

差不多,就是这样了。 字符串截取太麻烦了  详情 回复 发表于 2018-5-31 23:30
回复

使用道具 举报

16#
 楼主| 发表于 2018-5-31 23:30:54 | 只看该作者
dos时代菜鸟 发表于 2018-5-31 21:59
我基本上明白你的意思了

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

差不多,就是这样了。
字符串截取太麻烦了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-23 21:31

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表