
Я хочу использовать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