怎么获得 磁盘 和 卷 的对应关系
本帖最后由 newswan 于 2018-6-2 12:13 编辑wmic DISKDRIVE
Name=\\.\PHYSICALDRIVE1
Partitions=3
wmic LOGICALDISK
Name=M:
VolumeName=U3
那么,怎么得到 磁盘 和 卷 的对应关系,wmic 可以吗?
使用 diskpart 的批处理,最后结果。 本帖最后由 plusv 于 2018-5-27 06:01 编辑
获得 磁盘 和 卷 的对应关系
attach://371782.zip
本帖最后由 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
wmic volume get caption,deviceid
或者
mountvol vbs调用 wimc
本帖最后由 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 13:13
如果用select 可能更简便一些,另外 cmd 下也应该可以实现。
wimc 中 没有 Win32_DiskPartition 的别名定义,不知道怎么创建。 To:newswan
Q:>但是在我这里报错,win10
A:PowerShell Set-ExecutionPolicy UnRestricted
>用 diskpart 太麻烦了
A:这不是 DiskPart
>另外,没有盘符的分区,能显示么?例如 efi msr 或 其他隐藏的分区。
A:如附图,改一列.
本帖最后由 newswan 于 2018-5-30 11:24 编辑
用了一个vhd磁盘测试,
分区是这样的:
Test.ps1
HD3.1.VBS
都没有显示出没有盘符的卷 本帖最后由 dos时代菜鸟 于 2018-5-30 20:56 编辑
看脚本内容就知道了,我那个本来就是只显示分配盘符的分区。
稍微修改 是可以显示 没有盘符的 分区的,但是也 仅仅能够知道 该分区 所在的硬盘 位置,其他的什么大小,卷标,格式类型也都 无法获取。
用 diskpart 也不麻烦 可以看 http://wuyou.net/forum.php?mod=viewthread&tid=404993&fromuid=1198 我也觉的用 DiskPart 才是好方法.
dos时代菜鸟 发表于 2018-5-30 18:41
看脚本内容就知道了,我那个本来就是只显示分配盘符的分区。
稍微修改 是可以显示 没有盘符的 分区的, ...
谢谢 本帖最后由 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: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 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 不支持的 分区,也要把信息 弄一下,这样就影响效率了。
dos时代菜鸟 发表于 2018-5-31 21:59
我基本上明白你的意思了
看这个吧 ,运行效率 有点儿低,因为要频繁调用 diskpart 对每一个分区进行 探 ...
差不多,就是这样了。{:1_195:}
字符串截取太麻烦了
页:
[1]