Board logo

标题: [文本处理] [已解决]如何使用批处理获得特定卷标的分区,它所在的硬盘序号? [打印本页]

作者: 5i365    时间: 2021-8-5 06:59     标题: [已解决]如何使用批处理获得特定卷标的分区,它所在的硬盘序号?

本帖最后由 5i365 于 2021-8-7 09:42 编辑

例如,我想知道电脑所有硬盘上卷标为ssd1的分区, 它所在的硬盘序号, 目前本人只能手动输入命令, 从输出的信息中去判断, 想知道能否使用批处理来实现, 恳请诸位大侠支招, 非常感谢
另外,如果有多个卷标为ssd1的分区,只处理第一个

也有可能, 还有更简单的其它方式来实现, 同样欢迎各位交流讨论

手动操作的详细步骤:
1.Win+R输入cmd回车, 进入命令行, 然后输入diskpart 进入命令

2.输入list disk 回车,会列出电脑上所有的硬盘, 在显示的列表信息中  ###下面就是硬盘的序号, 我的电脑当前有两个硬盘, 所以显示了, 磁盘 0 磁盘 1

3.输入select disk 0 进入磁盘0

4.输入detail disk 显示磁盘0的所有详细信息, 其中,  【标签】的下面就是这个硬盘所包含的所有分区的卷标
信息中显示:
磁盘0有3个区, 分区的卷标, 分别为nvme1  nvme2  EFI
并没有我要找的卷标ssd1的分区, 所以继续向下操作

5.输入select disk 1 进入磁盘1

6.输入detail disk 显示磁盘1的所有详细信息, 其中,  【标签】的下面就是这个硬盘所包含的所有分区的卷标
信息中显示:
磁盘1有3个区, 分区的卷标, 分别为ssd1  ssd2  EFI
里面有我要找的卷标ssd1的分区, 所以不再继续向下操作, 我得出结论: 标卷为ssd1的分区, 它所在的硬盘序号是1

提醒:
上面的命令中,想得到每个硬盘的详情,可以将相应的命令保存在一个文件【如d0.txt】中, 然后使用下面的方式执行获得磁盘0详情, 其它磁盘也一样
例如, 我把如下的获取磁盘0详情的命令保存为d0.txt
list disk
select disk 0
detail disk
然后在批处理中执行下面命令,详情会输出到d0_info.txt
diskpart /s d0.txt >d0_info.txt
当然后也可以将d0.txt也可直接用命令生成,例如:
(echo, list disk
echo, select disk 0
echo, detail disk)>d0.txt
diskpart /s d0.txt >d0_info.txt

自己百度找到获取当前电脑硬盘数量的批处理代码:
  1. @echo off
  2. cd.>script.txt
  3. >>script.txt echo list disk
  4. for /f %%i in ('diskpart /s script.txt^|find /c ^"联机^"') do Set HardDrivers=%%i
  5. ::del script.txt /q
  6. echo 您的计算机上硬盘安装数量为:%HardDrivers%
  7. pause
复制代码
手动输入命令, 从输出的信息中去判断,完整操作的详情如下:
  1. X:\Users\Administrator>diskpart
  2. Microsoft DiskPart 版本 10.0.19041.1
  3. Copyright (C) Microsoft Corporation.
  4. 在计算机上: WinPE
  5. DISKPART> list disk
  6.   磁盘 ###  状态           大小     可用     Dyn  Gpt
  7.   --------  -------------  -------  -------  ---  ---
  8.   磁盘 0    联机              465 GB    50 GB        *
  9.   磁盘 1    联机              465 GB    83 GB        *
  10. DISKPART> select disk 0
  11. 磁盘 0 现在是所选磁盘。
  12. DISKPART> detail disk
  13. Samsung SSD 850 EVO 500GB
  14. 磁盘 ID: {5B30C043-F56D-11EB-8B35-F803154EB4DB}
  15. 类型   : SATA
  16. 状态 : 联机
  17. 路径   : 1
  18. 目标 : 0
  19. LUN ID : 0
  20. 位置路径 : PCIROOT(0)#PCI(1C03)#PCI(0000)#ATA(C01T00L00)
  21. 当前只读状态: 否
  22. 只读: 否
  23. 启动磁盘: 否
  24. 页面文件磁盘: 否
  25. 休眠文件磁盘: 否
  26. 故障转储磁盘: 否
  27. 群集磁盘  : 否
  28.   卷 ###      LTR  标签         FS     类型        大小     状态       信息
  29.   ----------  ---  -----------  -----  ----------  -------  ---------  --------
  30.   卷     0     G   nvme1          NTFS   磁盘分区          80 GB  正常
  31.   卷     1     H   nvme2         NTFS   磁盘分区         284 GB  正常
  32.   卷     2         EFI          FAT32  磁盘分区        1027 MB  正常         已隐藏
  33. DISKPART> select disk 1
  34. 磁盘 1 现在是所选磁盘。
  35. DISKPART> detail disk
  36. KINGSTON SA2000M8500G
  37. 磁盘 ID: {33E8B399-451F-43F3-BB00-A1116C0B80AE}
  38. 类型   : NVMe
  39. 状态 : 联机
  40. 路径   : 0
  41. 目标 : 0
  42. LUN ID : 0
  43. 位置路径 : PCIROOT(0)#PCI(0100)#PCI(0000)#NVME(P00T00L00)
  44. 当前只读状态: 否
  45. 只读: 否
  46. 启动磁盘: 否
  47. 页面文件磁盘: 否
  48. 休眠文件磁盘: 否
  49. 故障转储磁盘: 否
  50. 群集磁盘  : 否
  51.   卷 ###      LTR  标签         FS     类型        大小     状态       信息
  52.   ----------  ---  -----------  -----  ----------  -------  ---------  --------
  53.   卷     3     C   ssd1          NTFS   磁盘分区          80 GB  正常
  54.   卷     4     D   ssd2         NTFS   磁盘分区         264 GB  正常
  55.   卷     5         EFI          FAT32  磁盘分区        1027 MB  正常         已隐藏
  56. DISKPART>
复制代码

作者: newswan    时间: 2021-8-5 19:29

本帖最后由 newswan 于 2021-8-5 19:33 编辑

wmic 方便一些,用 diskpart 麻烦
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set _label_=New Volume
  4. for /f "usebackq tokens=2 delims==" %%a in (`
  5.     wmic logicaldisk where ^(VolumeName^='%_label_%'^) get name /value
  6. `) do (
  7.     if not defined _letter_ (set _letter_=%%a)
  8. )
  9. echo %_letter_%
  10. for /f "usebackq tokens=3 delims==" %%a in (`
  11.     wmic path Win32_LogicalDiskToPartition.Dependent^='Win32_LogicalDisk.DeviceID^="%_letter_%"' get Antecedent /value
  12. `) do (
  13.     set _dp_=%%a
  14.     set _dp_=!_dp_:""="%!
  15. )
  16. echo %_dp_%
复制代码

作者: newswan    时间: 2021-8-5 19:37

pe下?支持wmic吗?
作者: 5i365    时间: 2021-8-6 06:52

本帖最后由 5i365 于 2021-8-6 08:13 编辑

回复 2# newswan


    你好, 感谢支招,上面代码在win7下运行是OK的, 没有这一行,不行 setlocal ENABLEDELAYEDEXPANSION
作者: 5i365    时间: 2021-8-6 06:53

本帖最后由 5i365 于 2021-8-6 08:14 编辑

回复 3# newswan


    对, 刚刚在WIN下试的,

在PE下测试,不行, 显示下面的错误

节点 - Winpe
错误:
描述 = 常规故障
ECHO 处于关闭状态。
没有可用实例。
ECHO 处于关闭状态。
请按任意键继续.
作者: newswan    时间: 2021-8-6 11:57

回复 5# 5i365


那么,你的pe里有没有 findstr  ,或者 sed grep awk
作者: 5i365    时间: 2021-8-6 16:04

回复 6# newswan


     findstr 这个好像可以执行
作者: went    时间: 2021-8-6 16:48

第二句是为了提权,如果是PE环境下可以删掉
vol是查找的卷标
  1. @echo off & cd /d "%~dp0"
  2. %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","REM",,"runas",1)(window.close)&exit
  3. set "diskNo=-1"
  4. set "vol=Win10"
  5. for /l %%i in (0,1,10) do (
  6. (
  7. echo select disk %%i
  8. echo detail disk
  9. ) | diskpart | findstr /i /C:" %vol% " >nul 2>nul && (
  10. set "diskNo=%%i"
  11. goto :next
  12. )
  13. )
  14. :next
  15. echo %diskNo%
  16. pause&exit
复制代码

作者: newswan    时间: 2021-8-6 17:01

试试这个呢
http://www.bathome.net/viewthrea ... 2%BC%FE%D0%C5%CF%A2
作者: 5i365    时间: 2021-8-6 17:42

本帖最后由 5i365 于 2021-8-6 17:43 编辑

回复 8# went


    大侠牛B, 药到病除,非常感谢
想接着请教大侠,在当前的代码下, 能否顺便填加两个功能
1.如何获取卷标为Win的盘符和分区序号, 变量名分别为%winpf%  %winno%, 这样,我就得到卷标为win的分区, 它的盘符, 它的分区序号, 和它所在的硬盘序号
2.如果我想同时获取三个卷标所在分区的盘符,分区序号和硬盘号,复制同样的代码三份,应该可以实现, 但是能在当前代码稍改一下实现吗? 例如,同时查卷标为Win   soft    data 的分区的盘符,分区序号和各自所在的硬盘号

分区序号是下面的###下面的部分:

  卷 ###      LTR  标签         FS     类型        大小     状态       信息
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  卷     0     C   Win          NTFS   磁盘分区          80 GB  正常         启动
  卷     1     D   soft         NTFS   磁盘分区         92 GB  正常
  卷     2     E    data          NTFS   磁盘分区          29 GB  正常
  卷     3         EFI          FAT32  磁盘分区        1027 MB  正常         系统
作者: 5i365    时间: 2021-8-6 17:43

回复 9# newswan


   感谢大侠指引
作者: newswan    时间: 2021-8-6 17:54

回复 11# 5i365


  看了一下,里面还是用的 wmic ,只有用 diskpart
作者: 5i365    时间: 2021-8-6 18:07

回复 12# newswan


    嗯, 二楼朋友的代码, 可以显示硬盘号, 分区号, 盘符, 但是PE下运行不了
作者: 5i365    时间: 2021-8-6 19:23

本帖最后由 5i365 于 2021-8-6 19:25 编辑

回复 12# newswan


    根据卷标判断盘符,找到了另一种方法, 不过又加了很多个循环, 判断分区号,还没找到方法, 如果还是在你的代码里一并实现就更好了:

for %%a in (Z Y X W V U T S R Q P O N M L K J I H G F E D C B A ) do (
vol %%a:|findstr /i /e win&&set win=%%a
vol %%a:|findstr /i /e soft&&set soft=%%a
)
echo soft所在盘符为%soft%:, win所在盘符为%win%:
作者: newswan    时间: 2021-8-6 19:49

本帖最后由 newswan 于 2021-8-6 20:00 编辑

回复 14# 5i365


pe很多不带wmic powershell ,不然很方便,用 diskpart 处理太麻烦
去无忧论坛找,有现成的,功能很多
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=409455&extra=&page=1
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=409570&extra=page%3D2
作者: idwma    时间: 2021-8-6 20:06

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('^(echo list disk ^)^|diskpart^|find "联机"') do set/a n+=1
set/a n=!n!-1
for /l %%i in (0,1,!n!) do (
for %%a in (Win soft data) do (
(echo select disk %%i &echo detail disk)|diskpart|find "%%a">nul && echo %%a在硬盘:%%i
)
)
pause
作者: went    时间: 2021-8-7 00:18

回复 10# 5i365


    如果卷标中间有空格显示会不准确
ansi编码
  1. @echo off & cd /d "%~dp0"
  2. %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","REM",,"runas",1)(window.close)&exit
  3. setlocal enabledelayedexpansion
  4. set "labs=Win10|Backup"
  5. set "num=1"
  6. for /l %%i in (0,1,10) do (
  7. for /f "tokens=2,3,4,5,7,8" %%a in ('(echo select disk %%i ^& echo detail disk ^) ^| diskpart ^| findstr /i "%labs:|= %"') do (
  8. set "disk_!num!=%%i"
  9. set "part_!num!=%%a"
  10. set "letter_!num!=%%b"
  11. set "lab_!num!=%%c"
  12. set "fs_!num!=%%d"
  13. set "size_!num!=%%e%%f"
  14. set /a "num+=1"
  15. )
  16. )
  17. set /a "num-=1"
  18. for /l %%i in (1,1,%num%) do (
  19. echo 硬盘号: !disk_%%i! 分区号: !part_%%i! 盘符: !letter_%%i! 卷标:!lab_%%i! 类型:!fs_%%i! 大小:!size_%%i!
  20. )
  21. pause&exit
复制代码

作者: went    时间: 2021-8-7 00:21

回复 17# went


    多个卷标使用|分隔,如
  1. set "labs=Win10|Backup|Sortware|Games"
复制代码

作者: 5i365    时间: 2021-8-7 05:15

回复 17# went
再次感谢大侠支招, 分别在Win下和PE下测试了一下, 结果如下:

Win下会有计算机名显示在除第二行和第三行的分区号后面:

硬盘号: 0       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 0       分区号: 0       盘符: C 卷标:Win        类型:NTFS       大小:80GB
硬盘号: 0       分区号: 1       盘符: D 卷标:soft       类型:NTFS       大小:112GB
硬盘号: 1       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 2       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 3       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 4       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 5       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 6       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 7       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 8       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 9       分区号: WIN7    盘符:  卷标:    类型:   大小:
硬盘号: 10      分区号: WIN7    盘符:  卷标:    类型:   大小:
请按任意键继续. . .

PE下会有硬盘型号显示在第一行的分区号后面:

硬盘号: 0       分区号: SP550   盘符:  卷标:    类型:   大小:
硬盘号: 0       分区号: 0       盘符: D 卷标:Win        类型:NTFS       大小:80GB
硬盘号: 0       分区号: 1       盘符: C 卷标:soft       类型:NTFS       大小:112GB
请按任意键继续. . .

另外,请教大侠, 如果在后续的代码里使用各自的变量呢?
例如,要在代码中搜索的是卷标是 win 和 soft ,各自的硬盘号, 分区号, 盘符变量名分别为
%win_yph%  %win_fqh%  %win_pf%
%soft_yph%  %soft_fqh%  %soft_pf%

后面代码中要用到它们,如:

if %win_fqh%=="2"
if %soft_yqh%=="1"
if %soft_pf%=="C:"
作者: went    时间: 2021-8-7 09:23

照下面代码取变量
  1. @echo off & cd /d "%~dp0"
  2. %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","REM",,"runas",1)(window.close)&exit
  3. set "labs=Win10|Backup|Software|Games"
  4. for /l %%i in (0,1,10) do (
  5. for /f "tokens=2,3,4,5,7,8" %%a in ('(echo select disk %%i ^& echo detail disk ^) ^| diskpart ^| findstr /i "%labs:|= %"') do (
  6. set "%%c_yph=%%i"
  7. set "%%c_fqh=%%a"
  8. set "%%c_pf=%%b"
  9. set "%%c_lab=%%c"
  10. set "%%c_fs=%%d"
  11. set "%%c_size=%%e%%f"
  12. )
  13. )
  14. REM 获取卷标为Win10的相关信息
  15. echo 硬盘号: %Win10_yph% 分区号: %Win10_fqh% 盘符: %Win10_pf% 卷标: %Win10_lab% 类型:%Win10_fs% 大小:%Win10_size%
  16. REM 获取卷标为Backup的相关信息
  17. echo 硬盘号: %Backup_yph% 分区号: %Backup_fqh% 盘符: %Backup_pf% 卷标: %Backup_lab% 类型:%Backup_fs% 大小:%Backup_size%
  18. pause&exit
复制代码
回复 19# 5i365
作者: 5i365    时间: 2021-8-7 09:29

回复 20# went

你好, 刚刚试了一下, 上面的代码,执行后,结果是空的:

硬盘号:         分区号:         盘符:  卷标:            类型:   大小:
硬盘号:         分区号:         盘符:  卷标:            类型:   大小:
请按任意键继续. . .
作者: went    时间: 2021-8-7 09:36

回复 21# 5i365


    labs改了吗
作者: 5i365    时间: 2021-8-7 09:38

回复 22# went

我真是笨到家了, 忘改了,

刚试了一下, 完美执行, 代码小巧, 牛X
作者: 5i365    时间: 2021-8-20 15:07

回复 20# went


    你好, 分区号,应该以list part里面的号为准, 从1开始的, 例如下面的操作步骤, 卷标为Win10的分区其分区号应该是1,而不是0,如何修改? 感谢:


Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>diskpart

Microsoft DiskPart 版本 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
在计算机上: WIN7

DISKPART> sel disk 0

磁盘 0 现在是所选磁盘。

DISKPART> detail disk

Apacer  AS340 240GB ATA Device
磁盘 ID: {DA5845C4-638E-454A-B89D-3B786EEC8A1A}
类型   : SATA
状态 : 联机
路径   : 0
目标 : 0
LUN ID : 0
位置路径 : PCIROOT(0)#PCI(1F02)#ATA(C00T00L00)
当前只读状态: 否
只读: 否
启动磁盘: 是
页面文件磁盘: 是
休眠文件磁盘: 否
故障转储磁盘: 是
群集磁盘  : 否

  卷 ###      LTR  标签         FS     类型        大小     状态       信息
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  卷     0     C   win10        NTFS   磁盘分区          80 GB  正常         启动
  卷     1     D   DATA         NTFS   磁盘分区         112 GB  正常
  卷     2         W10          NTFS   磁盘分区          29 GB  正常
  卷     3         EFI          FAT32  磁盘分区        1027 MB  正常         系统

DISKPART> list part

  分区 ###       类型              大小     偏移量
  -------------  ----------------  -------  -------
  分区      1    系统                1027 MB  1024 KB
  分区      2    主要                  80 GB  1028 MB
  分区      3    主要                 112 GB    81 GB
  分区      4    主要                  29 GB   193 GB

DISKPART>




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