如何使用PowerShell处理diskpart命令的输出结果

3
我会尽力完成翻译工作,以下是您需要翻译的内容:

我正在尝试从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%

输出:

C盘的卷号为:2

使用PowerShell:

$dp = "list volume" | diskpart | ? { $_ -match "^  [^-]" }> 
$dp

输出:

卷 ###  Ltr  Label        Fs     Type        Size    Status    Info
卷 0     E                       DVD-ROM        0 B  没有媒体
卷 1         系统保留       NTFS   分区      350 MB  健康      系统
卷 2     C                NTFS   分区       59 GB  健康      引导
卷 3     D   新卷          NTFS   分区       49 GB  健康

我想使用PowerShell将卷号(例如C:\的卷号为2)捕获到一个变量中。


3
为什么不使用PowerShell中的本机CMDLET而是解析DISKPART输出? - Squashman
1
@Squashman 直到8.1/10版本才引入它们(我记不清是哪个版本了)。 - Maximilian Burszley
2个回答

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

0
一种简洁的解决方案,使用-match查找感兴趣的行,并使用-split的一元形式将其拆分为以空格分隔的标记,可以通过索引访问这些标记:
$drive = 'C'
$volNo = (-split (('list volume' | diskpart) -match " $drive "))[1]
"Volume No. for $drive Drive is: $volNo"

请注意,diskpart 必须从 提升的 会话中运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接