Betrachten Sie das folgende Powershell-Skript, das nach Ordnern in C: \ mit einem 'og' im Namen sucht:
PS C: \> (ls |% {$ _. Name} |? {$ _. Enthält ("og")}) PerfLogs Programmdateien setup.log
Jetzt grenze ich die Suche ein, um nur einen Artikel zu erhalten:
PS C: \> (ls |% {$ _. Name} |? {$ _. Enthält ("Prog")}) Programmdateien
Das Seltsame ist, dass die erste Operation ein Array ergibt , während die zweite Operation (die meiner Meinung nach semantisch dieselbe Operation ist, also dieselbe Art von Ergebnis liefern sollte) eine Zeichenfolge ergibt . Dies ist im folgenden Ergebnis zu sehen:
PS C: \> (ls |% {$ _. Name} |? {$ _. Enthält ("og")}). Länge 3 PS C: \> (ls |% {$ _. Name} |? {$ _. Enthält ("Prog")}). Länge 13
Dies kann sehr irritierend sein, da es anscheinend weniger Ordner gibt, die mit 'og' übereinstimmen als mit 'Prog'.
Offensichtlich 'entpackt' PowerShell implizit ein einzelnes Elementarray für ein einzelnes Objekt, und es wird nie ein Array der Länge 1 angezeigt. Es scheint, dass ich jedes Mal, wenn ich die über die Pipeline kommenden Ergebnisse zählen möchte, überprüfen muss, ob ich Ich habe es mit einem Array zu tun oder nicht.
Wie kann ich das verhindern? Wie gehst du damit um?
$_.Contains
, dann%{,,$_.Name}
funktioniert ...