如何使用PowerShell处理diskpart命令的put

时间:2018-07-23 13:55:01

标签: powershell batch-file

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

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必须从提升会话运行。