另一个grep / awk q,解析diskpart输出

时间:2017-03-08 19:34:49

标签: powershell

我已经搜索过很多相关的问题,但是我无法弄清楚如何将它们组合在一起以使其适用于我。此外,MS决定将动态卷从PowerShell cmdlet中移除的事实真的令人沮丧。

在下面的代码中我尝试识别"磁盘2"是动态的。

PS C:\Windows\system32> echo 'list disk' | diskpart

Microsoft DiskPart version 10.0.14393.0

Copyright (C) 1999-2013 Microsoft Corporation.
On computer: AHPAP2704

DISKPART> 
  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online           65 GB      0 B         
  Disk 1    Online           20 GB      0 B        *
  Disk 2    Offline          50 GB      0 B   *     

理想情况下,从上面的输出我要设置一个变量来识别动态音量(我的剧本总是只有一个)所以当完成时我会留下像$DynDisk = 2这样的东西。

当我将输出传递给Get-Member时,名称中包含属性的唯一成员类型为CharsLength

有没有一种简单的方法可以将数据放入数组或更好的方法?或者,有一些隐藏的grepawk类似cmdlet的机会吗?

2 个答案:

答案 0 :(得分:2)

diskpart输出未被修剪,因此您可以从字符串末尾解析相关信息,例如像这样:

$re = 'disk (\d+)\s+(\w+)\s+(\d+ .?b)\s+(\d+ .?b)  (.*)'

'list disk' | diskpart | Select-String -Pattern $re | ForEach-Object {
  New-Object -Type PSObject -Property @{
    ID        = [int]$_.Matches.Groups[1].Value
    Status    = $_.Matches.Groups[2].Value -eq 'online'
    Size      = $_.Matches.Groups[3].Value
    FreeSpace = $_.Matches.Groups[4].Value
    Dynamic   = $_.Matches.Groups[5].Value.Substring(0, 3).Trim() -eq '*'
    GPT       = $_.Matches.Groups[5].Value.Substring(4, 3).Trim() -eq '*'
  }
}

答案 1 :(得分:0)

我所需要的只是另一个半小时的谷歌搜索。 https://gallery.technet.microsoft.com/DiskPartexe-Powershell-0f7a1bab

该脚本创建了3个对象,这些对象具有我现在知道要处理的属性