使用 Powershell 匹配并打印输出中的特定列

Use Powershell to match and print specific column from output

我想从命令的输出中获取特定的列。有人可以建议最好的方法是什么吗?

使用的命令是 - choco list -lo 输出为

Chocolatey v0.10.15
chocolatey 0.10.15
erlang 22.3
rabbitmq 3.8.11
3 packages installed.

从给定的输出中,唯一需要的值是 3.8.11,它是 rabbitmq.

的版本

我已经尝试过了,但它不起作用 - choco list -lo | Select-String -Pattern "rabbit" | %{ $_.Split(' ')[1]; }

有人可以建议我们该怎么做吗?

提前致谢:)

试试这个:

choco list -lo | 
    Select-String -Pattern "rabbitmq (.+)" | 
    ForEach-Object { $_.Matches.Groups[1].Value }

Select-String的输出是一个MatchInfo对象,所以你需要查询它的成员来得到匹配的值。

我正在使用组 (.+) 来启用版本号提取,而无需进一步的字符串操作。然后通过 $_.Matches.Groups[1].ValueForEach-Object 1 脚本块中读取组值。在此表达式中,索引 1 指定第一组(索引 0 将指定整个匹配项)。


[1] ForEach-Object 缩写为 %

没有逗号可以根据您发布的内容进行拆分。这是一个 space...

我没有安装 choco,因为我没有它的用​​例。所以,一个伪列表是:

选项 1:

Clear-Host
$ChocoList = @'
Chocolatey v0.10.15
chocolatey 0.10.15
erlang 22.3
rabbitmq 3.8.11
'@ -Split "`n"

$ChocoList | 
ForEach {
    (
        $PSItem | 
        Select-String -Pattern 'rabbitmq'
    ) -Split (' ')
}
# Results
<#
rabbitmq
3.8.11
#>

选项2

([regex]::Matches($ChocoList,'rabbitmq.*').Value -split ' ')
# Results
<#
rabbitmq
3.8.11
#>

根据我对您的评论进行更新 - 选项 1:

Clear-Host
$ChocoList = @'
Chocolatey v0.10.15
chocolatey 0.10.15
erlang 22.3
rabbitmq 3.8.11
'@ -Split "`n"

($ChocoList | 
ForEach {
    (
        $PSItem | 
        Select-String -Pattern 'rabbitmq'
    ) -Split (' ')
})[1]
# Results
<#
3.8.11
#>

根据我回复您的评论更新 - 选项 2

([regex]::Matches($ChocoList,'rabbitmq.*').Value -split ' ')[1]
# Results
<#
3.8.11
#>