
Ich möchte benutzenselect-string
auf der Ausgabe eines anderen Befehls (ähnlich wie grep
bei einem Unix-Betriebssystem).
Hier ist die Ausgabe des Befehls ohne 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
Wenn ich verwende select-string
, erhalte ich aus irgendeinem Grund leere Zeilen:
> (dir resources).Name | select-string Windows
wmd-Windows-22022.json
wmd-Windows-22023.json
wmd-Windows-22024.json
Wie kann ich entweder (A) select-string anweisen, die leeren Zeilen ohne Übereinstimmungen zu löschen, oder (B) die Ausgabe an ein anderes Powershell-Dienstprogramm weiterleiten, das die leeren Zeilen für mich löschen kann?
Antwort1
Select-String gibt ein Array von MatchInfo zurück, wie gezeigt durch((dir resources).Name | select-string Windows)[0].GetType()
Um das gewünschte Ergebnis zu erhalten, wandeln Sie Ihren gesamten Ausdruck einfach in [string[]] um:
[string[]]((dir resources).Name | select-string Windows)
Antwort2
Ich habe eine Lösung gefunden:
((Dir-Ressourcen).Name | Auswahlzeichenfolge Windows | Ausgabezeichenfolge).Trim()
out-string
konvertiert eine Eingabe von einem anderen Befehl in eine Zeichenfolge und Trim()
ist eine Funktion, die nur mit Zeichenfolgen funktioniert (d. h. Trim()
sie funktioniert nicht mit der Ausgabe eines Befehls, der einen anderen Typ als eine Zeichenfolge zurückgibt).
Antwort3
Hier ist eine All-in-One-Funktion zum einfachen Schreiben einer Liste (als Ausgabeergebnis). Leerzeilen werden entfernt und können weitergeleitet werden. Unten sind 2 Anwendungsbeispiele aufgeführt. Ich hoffe, das hilft.
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 $_
}
}
}
}
Beispiel 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
Beispiel Nr. 2:
Get-Service -Name "*openvpn*" | Select-Object DisplayName,Name,Status,StartType | Write-List -Prefixe " - "
- DisplayName : OpenVPN Interactive Service
- Name : OpenVPNServiceInteractive
- Status : Running
- StartType : Automatic