标题: [文本处理] [已解决]如何使用批处理获得特定卷标的分区,它所在的硬盘序号? [打印本页]
作者: 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
自己百度找到获取当前电脑硬盘数量的批处理代码:- @echo off
- cd.>script.txt
- >>script.txt echo list disk
- for /f %%i in ('diskpart /s script.txt^|find /c ^"联机^"') do Set HardDrivers=%%i
- ::del script.txt /q
- echo 您的计算机上硬盘安装数量为:%HardDrivers%
- pause
复制代码
手动输入命令, 从输出的信息中去判断,完整操作的详情如下:- X:\Users\Administrator>diskpart
-
- Microsoft DiskPart 版本 10.0.19041.1
-
- Copyright (C) Microsoft Corporation.
- 在计算机上: WinPE
-
- DISKPART> list disk
-
- 磁盘 ### 状态 大小 可用 Dyn Gpt
- -------- ------------- ------- ------- --- ---
- 磁盘 0 联机 465 GB 50 GB *
- 磁盘 1 联机 465 GB 83 GB *
-
- DISKPART> select disk 0
-
- 磁盘 0 现在是所选磁盘。
-
- DISKPART> detail disk
-
- Samsung SSD 850 EVO 500GB
- 磁盘 ID: {5B30C043-F56D-11EB-8B35-F803154EB4DB}
- 类型 : SATA
- 状态 : 联机
- 路径 : 1
- 目标 : 0
- LUN ID : 0
- 位置路径 : PCIROOT(0)#PCI(1C03)#PCI(0000)#ATA(C01T00L00)
- 当前只读状态: 否
- 只读: 否
- 启动磁盘: 否
- 页面文件磁盘: 否
- 休眠文件磁盘: 否
- 故障转储磁盘: 否
- 群集磁盘 : 否
-
- 卷 ### LTR 标签 FS 类型 大小 状态 信息
- ---------- --- ----------- ----- ---------- ------- --------- --------
- 卷 0 G nvme1 NTFS 磁盘分区 80 GB 正常
- 卷 1 H nvme2 NTFS 磁盘分区 284 GB 正常
- 卷 2 EFI FAT32 磁盘分区 1027 MB 正常 已隐藏
-
- DISKPART> select disk 1
-
- 磁盘 1 现在是所选磁盘。
-
- DISKPART> detail disk
-
- KINGSTON SA2000M8500G
- 磁盘 ID: {33E8B399-451F-43F3-BB00-A1116C0B80AE}
- 类型 : NVMe
- 状态 : 联机
- 路径 : 0
- 目标 : 0
- LUN ID : 0
- 位置路径 : PCIROOT(0)#PCI(0100)#PCI(0000)#NVME(P00T00L00)
- 当前只读状态: 否
- 只读: 否
- 启动磁盘: 否
- 页面文件磁盘: 否
- 休眠文件磁盘: 否
- 故障转储磁盘: 否
- 群集磁盘 : 否
-
- 卷 ### LTR 标签 FS 类型 大小 状态 信息
- ---------- --- ----------- ----- ---------- ------- --------- --------
- 卷 3 C ssd1 NTFS 磁盘分区 80 GB 正常
- 卷 4 D ssd2 NTFS 磁盘分区 264 GB 正常
- 卷 5 EFI FAT32 磁盘分区 1027 MB 正常 已隐藏
-
- DISKPART>
复制代码
作者: newswan 时间: 2021-8-5 19:29
本帖最后由 newswan 于 2021-8-5 19:33 编辑
wmic 方便一些,用 diskpart 麻烦- @echo off
- setlocal ENABLEDELAYEDEXPANSION
-
- set _label_=New Volume
- for /f "usebackq tokens=2 delims==" %%a in (`
- wmic logicaldisk where ^(VolumeName^='%_label_%'^) get name /value
- `) do (
- if not defined _letter_ (set _letter_=%%a)
- )
- echo %_letter_%
-
- for /f "usebackq tokens=3 delims==" %%a in (`
- wmic path Win32_LogicalDiskToPartition.Dependent^='Win32_LogicalDisk.DeviceID^="%_letter_%"' get Antecedent /value
- `) do (
- set _dp_=%%a
- set _dp_=!_dp_:""="%!
- )
- 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是查找的卷标- @echo off & cd /d "%~dp0"
- %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","REM",,"runas",1)(window.close)&exit
- set "diskNo=-1"
- set "vol=Win10"
- for /l %%i in (0,1,10) do (
- (
- echo select disk %%i
- echo detail disk
- ) | diskpart | findstr /i /C:" %vol% " >nul 2>nul && (
- set "diskNo=%%i"
- goto :next
- )
- )
- :next
- echo %diskNo%
- 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编码- @echo off & cd /d "%~dp0"
- %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","REM",,"runas",1)(window.close)&exit
- setlocal enabledelayedexpansion
- set "labs=Win10|Backup"
- set "num=1"
- for /l %%i in (0,1,10) do (
- for /f "tokens=2,3,4,5,7,8" %%a in ('(echo select disk %%i ^& echo detail disk ^) ^| diskpart ^| findstr /i "%labs:|= %"') do (
- set "disk_!num!=%%i"
- set "part_!num!=%%a"
- set "letter_!num!=%%b"
- set "lab_!num!=%%c"
- set "fs_!num!=%%d"
- set "size_!num!=%%e%%f"
- set /a "num+=1"
- )
- )
- set /a "num-=1"
- for /l %%i in (1,1,%num%) do (
- echo 硬盘号: !disk_%%i! 分区号: !part_%%i! 盘符: !letter_%%i! 卷标:!lab_%%i! 类型:!fs_%%i! 大小:!size_%%i!
- )
- pause&exit
复制代码
作者: went 时间: 2021-8-7 00:21
回复 17# went
多个卷标使用|分隔,如- 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
照下面代码取变量- @echo off & cd /d "%~dp0"
- %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","REM",,"runas",1)(window.close)&exit
- set "labs=Win10|Backup|Software|Games"
- for /l %%i in (0,1,10) do (
- for /f "tokens=2,3,4,5,7,8" %%a in ('(echo select disk %%i ^& echo detail disk ^) ^| diskpart ^| findstr /i "%labs:|= %"') do (
- set "%%c_yph=%%i"
- set "%%c_fqh=%%a"
- set "%%c_pf=%%b"
- set "%%c_lab=%%c"
- set "%%c_fs=%%d"
- set "%%c_size=%%e%%f"
- )
- )
- REM 获取卷标为Win10的相关信息
- echo 硬盘号: %Win10_yph% 分区号: %Win10_fqh% 盘符: %Win10_pf% 卷标: %Win10_lab% 类型:%Win10_fs% 大小:%Win10_size%
- REM 获取卷标为Backup的相关信息
- echo 硬盘号: %Backup_yph% 分区号: %Backup_fqh% 盘符: %Backup_pf% 卷标: %Backup_lab% 类型:%Backup_fs% 大小:%Backup_size%
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |