我已经搜索过很多相关的问题,但是我无法弄清楚如何将它们组合在一起以使其适用于我。此外,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
时,名称中包含属性的唯一成员类型为Chars
和Length
。
有没有一种简单的方法可以将数据放入数组或更好的方法?或者,有一些隐藏的grep
和awk
类似cmdlet的机会吗?
答案 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个对象,这些对象具有我现在知道要处理的属性