如何使用 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 的主机名