如何仅从Select-Object中获得部分结果

时间:2020-07-05 23:51:59

标签: powershell

我有一个简单的问题,希望有人能帮忙...

如果我运行此命令;

\1\2\1

我以表格格式获得预期结果。它显示状态,类,FriendlyName和InstanceID。

接下来,我只想获取InstanceID,可以使用此命令进行操作;

get-pnpDevice -class display

但是我坚持的是,我只想获取结果的内部部分,而不是全部结果。换句话说,在我的系统上,如果运行上面的命令,则会得到以下结果;

PCI \ VEN_8086&DEV_5912&SUBSYS_872F1043&REV_04 \ 3&11583659&0&10
PCI \ VEN_10DE&DEV_1B81&SUBSYS_85971043&REV_A1 \ 4&35D4F288&0&0008

但是我要获得的结果是没有PCI \的结果,例如在&号之后的所有内容,例如,我不想看到&REV_04 \ 3&11583659&0&10或&REV_A1 \ 4&35D4F288&0&0008

有什么建议吗?

我尝试了建议的计算属性,但它返回的内容与我尝试执行的操作很接近,但不完全相同。我不了解计算所得的属性,因此请耐心等待。...结果如下;

InstanceID


VEN_8086
VEN_10DE

似乎截止了结果。我浏览了Microsoft Select-Object文档,它描述了一些有关计算属性的信息,但是它确实对-replace参数没有任何说明,因此我对如何使用它并对其进行修复感到迷茫。 。有没有更好的文档,您可以向我介绍有关的更多信息?

1 个答案:

答案 0 :(得分:1)

您可能需要使用Select-Object来计算属性。

Get-PnpDevice -Class display |
    Select-Object @{n='InstanceID';e={$_.InstanceId -replace '^PCI\\(.*?)&REV.*$','$1'}}

您可以添加其他属性(以逗号分隔)以及计算出的属性。

-replace operator使用正则表达式匹配。此处的示例使用捕获组(.*?),该捕获组名为捕获组1(以后用$1引用)捕获PCI\和第一个{{1}之间的所有字符}。 &REV是字符串的开头。 ^是字符串的结尾。 $贪婪地匹配零个或多个字符。由于.*是一个特殊的正则表达式字符,因此\用于对其进行转义以产生\

计算属性的\\e部分包含一个脚本块(expression中的代码)。脚本块内容对每个{}值(InstanceId)进行字符串替换。