我正在尝试从diskpart
命令输出中捕获卷号。目前,我正在这样做:
使用批处理脚本:
@echo off
set VOLNO=''
set DRIVE=C
for /f "tokens=2,3" %%a in ('echo list volume ^| diskpart') do (
if %%b==%DRIVE% set VOLNO=%%a
)
echo Volume No. for C Drive is: %VOLNO%
输出:
Volume No. for C Drive is: 2
使用PowerShell:
$dp = "list volume" | diskpart | ? { $_ -match "^ [^-]" }>
$dp
输出:
Volume ### Ltr Label Fs Type Size Status Info Volume 0 E DVD-ROM 0 B No Media Volume 1 System Rese NTFS Partition 350 MB Healthy System Volume 2 C NTFS Partition 59 GB Healthy Boot Volume 3 D New Volume NTFS Partition 49 GB Healthy
我想捕获卷号,例如使用PowerShell将C:\的值设置为2。
答案 0 :(得分:1)
调整正则表达式,以便您可以通过捕获组来提取所需的信息。我通常建议从提取的信息中构建自定义对象,以方便进一步处理。
这样的事情应该做你想要的:
$drive = 'c'
'list volume' | diskpart | Where-Object {
$_ -match 'Volume (\d+)\s+([a-z])\s+'
} | ForEach-Object {
New-Object -Type PSObject -Property @{
'DriveLetter' = $matches[2]
'VolumeNumber' = [int]$matches[1]
}
} | Where-Object {
$_.DriveLetter -eq $drive
} | Select-Object -Expand VolumeNumber
答案 1 :(得分:0)
一种简洁的解决方案,该解决方案使用-match
查找感兴趣的行和-split
的一元形式将其拆分为空格分隔的令牌,可通过索引访问这些令牌:
$drive = 'C'
$volNo = (-split (('list volume' | diskpart) -match " $drive "))[1]
"Volume No. for $drive Drive is: $volNo"
请注意,diskpart
必须从提升会话运行。