如何从powershell命令的结果中获取特定属性的值

时间:2013-12-17 09:45:11

标签: powershell

我有一个变量$ results,其值为:

SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 rdp-tcp#1         account17                 7  Active  rdpwd

我想单独获取ID的值,并在不同的查询中使用它。

我尝试了以下方法:

1。$idValue = @($result | %{ $_.ID }) - 但它没有获得价值。

2. $result |Select -ExpandProperty ID - 我收到错误'Select-Object:Property“ID”无法找到。“

如何从结果中单独获取属性ID的值?

3 个答案:

答案 0 :(得分:1)

qwinsta / query命令的输出是字符串,而不是对象,因此没有要打印的属性ID。如果希望字段为属性,则需要将字符串转换为对象:

query session | ? { $_ -match '^[ >](\S+) +(\S*?) +(\d+) +(\S+)' } |
  select @{n='Service';e={$matches[1]}},
         @{n='Username';e={$matches[2]}}, 
         @{n='ID';e={$matches[3]}},
         @{n='Status';e={$matches[4]}} | % {
  $_.ID
}

或者,如果您只对ID感兴趣,可以像这样更换正则表达式:

$account = 'account17'
$pattern = '^[ >]\S+ +\S*? +(\d+) +\S+.*'

(query session $account | select -Skip 1) -replace $pattern, '$1'

答案 1 :(得分:0)

这是正确引用单个属性的格式。我没有看到你的命令来创建你的RDP $结果,所以我将举例说明get-process,用()封装它并将().ID粘贴到最后。适用于任何属性,而不仅仅是.ID

(get-process | where {$_.Name -eq "Powershell"}|select ID).ID
# or
$MYID = (get-process | where {$_.Name -eq "Powershell"}|select ID).ID
$MYID

答案 2 :(得分:0)

另一种选择是-split:

一种解决方案,使用V4:

($result).ForEach({($_ -split '\s+')[2]}) -match '\d'