
Quiero usarselect-string
en la salida de otro comando (similar a cómo se usaría grep
en un sistema operativo Unix).
Aquí está el resultado del comando sin 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
Cuando uso select-string
, aparecen líneas en blanco por alguna razón:
> (dir resources).Name | select-string Windows
wmd-Windows-22022.json
wmd-Windows-22023.json
wmd-Windows-22024.json
¿Cómo puedo (A) decirle a select-string que se coma las líneas en blanco sin coincidencias, o (B) canalizar la salida a otra utilidad de PowerShell que pueda comer las líneas en blanco por mí?
Respuesta1
Select-String devuelve una matriz de MatchInfo, como se muestra en((dir resources).Name | select-string Windows)[0].GetType()
Para obtener lo que buscas, simplemente convierte tu expresión completa a [cadena[]]:
[string[]]((dir resources).Name | select-string Windows)
Respuesta2
Encontré una solución:
((dir recursos).Nombre | seleccionar-cadena Windows | fuera-cadena).Trim()
out-string
convierte una entrada de otro comando en una cadena, y Trim()
es una función que sólo funciona en cadenas (es decir, Trim()
no funcionará en la salida de un comando que devuelve algún tipo que no sea una cadena).
Respuesta3
Aquí hay una función todo en uno para escribir fácilmente una lista (como resultado de salida), se eliminan las líneas en blanco y se puede canalizar. 2 ejemplos de uso se muestran a continuación. Espero que esto ayude
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 $_
}
}
}
}
Ejemplo 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
Ejemplo #2:
Get-Service -Name "*openvpn*" | Select-Object DisplayName,Name,Status,StartType | Write-List -Prefixe " - "
- DisplayName : OpenVPN Interactive Service
- Name : OpenVPNServiceInteractive
- Status : Running
- StartType : Automatic