Как использовать select-string без пустых строк?

Как использовать select-string без пустых строк?

Я хочу использоватьselect-stringна выходе другой команды (аналогично тому, как это делается grepв ОС Unix).

Вот вывод команды без 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

Связанный контент