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

Posted

技术标签:

【中文标题】如何使用 PowerShell 处理 diskpart 命令的输出【英文标题】:How to process out put of diskpart command using PowerShell 【发布时间】:2018-12-31 00:13:18 【问题描述】:

我正在尝试从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 标签 Fs 类型 大小 状态信息 卷 0 E DVD-ROM 0 B 无媒体 第 1 卷系统资源 NTFS 分区 350 MB 健康系统 第 2 卷 C NTFS 分区 59 GB 健康启动 第 3 卷 D 新卷 NTFS 分区 49 GB 正常

我想捕获卷号,例如对于使用 PowerShell 的变量,它是 2。

【问题讨论】:

为什么不在 Powershell 中使用本机 CMDLETS 而不是解析 DISKPART 输出? @Squashman 他们直到 8.1/10 才被引入(不记得是哪个) 【参考方案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

【讨论】:

【参考方案2】:

一个简洁的解决方案,它使用-match 查找感兴趣的行并使用-split 的一元形式将其拆分为可以通过索引访问的空格分隔标记:

$drive = 'C'
$volNo = (-split (('list volume' | diskpart) -match " $drive "))[1]
"Volume No. for $drive Drive is: $volNo"

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

【讨论】:

以上是关于如何使用 PowerShell 处理 diskpart 命令的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Powershell 处理 sql_Variant sql 数据类型

如何使用批处理或 powershell 更改 Windows PC 的主机名

如何让 Powershell 运行批处理文件然后保持打开状态?

如何使用 PowerShell 处理数组以查找特定字符串?

如何在 PowerShell 中将文件作为流逐行处理

如何使程序仅在使用批处理或 powershell 有 Internet 连接时运行? [关闭]