【问题标题】:How to process out put of diskpart command using PowerShell如何使用 PowerShell 处理 diskpart 命令的输出
【发布时间】: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 才被引入(不记得是哪个)

标签: powershell batch-file


【解决方案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 必须从提升的会话运行。

    【讨论】:

      猜你喜欢
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多