如何使用没有空行的选择字符串?

如何使用没有空行的选择字符串?

我想使用select-stringgrep在另一个命令的输出上(类似于在 Unix OS 上的使用方式)。

以下是不带 的命令的输出select-string

> (dir resources).Name
wmd-Linux-22022.json
wmd-Linux-22023.json
wmd-Linux-22024.json
wmd-Windows-22022.json
wmd-Windows-22023.json
wmd-Windows-22024.json

当我使用时select-string,由于某种原因我得到了空白行:

> (dir resources).Name | select-string Windows

wmd-Windows-22022.json
wmd-Windows-22023.json
wmd-Windows-22024.json


我怎样才能(A)告诉 select-string 吃掉没有匹配项的空白行,或者(B)将输出通过管道传输到另一个可以为我吃掉空白行的 powershell 实用程序?

答案1

Select-String 返回 MatchInfo 数组,如下图所示((dir resources).Name | select-string Windows)[0].GetType()

为了得到你想要的结果,只需将整个表达式转换为[string[]]:

[string[]]((dir resources).Name | select-string Windows)

答案2

我找到了一个解决方案:

((dir resources).Name | select-string Windows | out-string).Trim()

out-string将另一个命令的输入转换为字符串,并且Trim()是仅对字符串起作用的函数(即,Trim()对返回某些非字符串类型的命令的输出不起作用)。

答案3

这是一个一体化函数,可以轻松编写列表(作为输出结果),删除空白行,可以通过管道传输。下面显示了 2 个使用示例希望对您有所帮助

function Write-List {
    Param(
        [Parameter(Mandatory, ValueFromPipeline)][array] $Array,
        [string]$Prefixe,
        [bool]$Numbering = $False
    )
    if ($Numbering) { 
        $NumberOfDigit = $($Array.Count).ToString().Length

        $Array | Format-List | Out-String -Stream | ForEach-Object -Process {
            if (-not [string]::IsNullOrWhiteSpace($_)) {
                "$Prefixe# {0,$NumberOfDigit} : {1}" -f (++$Index), $_
            }
        }
    } else {
        $Array | Format-List | Out-String -Stream | ForEach-Object -Process {
            if (-not [string]::IsNullOrWhiteSpace($_)) {
                "$Prefixe{0}" -f $_
            }
        }
    }
}

示例1:

Write-List @("titi", "toto", "tata", "titi", "toto", "tata", "titi", "toto", "tata", "titi", "toto", "tata") -Numbering $True
#  1 : titi
#  2 : toto
#  3 : tata
#  4 : titi
#  5 : toto
#  6 : tata
#  7 : titi
#  8 : toto
#  9 : tata
# 10 : titi
# 11 : toto
# 12 : tata

示例2:

Get-Service -Name "*openvpn*" | Select-Object DisplayName,Name,Status,StartType | Write-List -Prefixe " - "
 - DisplayName : OpenVPN Interactive Service
 - Name        : OpenVPNServiceInteractive
 - Status      : Running
 - StartType   : Automatic

相关内容