首页 > 解决方案 > PowerShell:如何从多列输出中的单列设置变量?

问题描述

Get-PhysicalDisk | Format-Table DeviceID, UniqueID用来获取 Windows 2016 服务器上所有驱动器的驱动器号和序列号列表。我想搜索一个序列号并仅捕获驱动器号作为变量。我习惯于在 UNIX 中使用 awk,但我完全不知道如何在 PowerShell 中实现这一点。

Get-PhysicalDisk | Format-Table DeviceID, UniqueID

DeviceID UniqueID                              
-------- --------                              
5        624A937024897B4FF488CBF800027A4B      
8        624A937024897B4FF488CBF800028A4D      
7        624A937024897B4FF488CBF800027A59      
0        {c4d394f5-509e-11e9-a834-806e6f6e6963}
1        {c4d394f6-509e-11e9-a834-806e6f6e6963}
2        {c4d394f7-509e-11e9-a834-806e6f6e6963}
3        {c4d394f8-509e-11e9-a834-806e6f6e6963}
4        {c4d394f9-509e-11e9-a834-806e6f6e6963}
6        624A937024897B4FF488CBF800027A56

我想扩展此命令以查找 SerialNumber 624A937024897B4FF488CBF800027A56,然后将调用的变量设置$DriveNumber为 的值,6如输出所示。

然后我计划使用此变量Set-Disk使驱动器脱机/联机作为执行卷覆盖。我不想硬编码驱动器号,因为重新启动后,驱动器号可能会改变。
注意我正在使用Get-Disk和管道适当的输出Set-Disk来执行我的驱动器离线/在线。但是,我有一个虚拟驱动器不显示的神秘问题Get-Disk,因此我试图找到一个解决方法,Get-PhysicalDisk谢谢!

标签: powershellvariablesoutput

解决方案


$driveNumber = (
  Get-PhysicalDisk | Where-Object UniqueId -eq '{624A937024897B4FF488CBF800027A56}'
).DeviceId

请注意需要将 GUID 字符串包含在{...}.

与所有 PowerShell cmdlet 一样,Get-PhysicalDisk输出您可以查询其属性的对象。

CmdletWhere-Object充当它从管道接收的对象的过滤器,并将属性的值UniqueId与指定的文字 GUID(字符串)进行比较,根据定义,它匹配(最多)一个对象。

(...).DeviceId返回目标对象DeviceId属性的值并将其分配给变量$driveNumber


重新使用Format-*cmdlet 的说明,例如Format-Table

只使用Format-*cmdlet 进行显示格式化

如果意图是进一步的程序化处理

  • 要么:简单地访问输入对象的内在属性(其可用性与它们是默认显示还是通过Format-*cmdlet 调用无关)

  • 或者:如果您需要创建仅具有原始属性的子集和/或转换的属性属性值(计算的属性,请使用Select-Object.


推荐阅读