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?
quelle
$_.Contains
, dann%{,,$_.Name}
funktioniert ...Antworten:
Und null Artikel ergibt sich zu
$null
.Das kannst du nicht.
Verwenden Sie den Array-Konstruktor (
@(...)
), um eine Auflistung (möglicherweise mit null oder einem Element) zu erzwingen, die Folgendes zurückgibt:quelle
@(1) | ConvertTo-Json
kehrt immer noch1
statt[1]
.ConvertTo-Json
niemals eine Sammlung zurück. Es liest die gesamte Eingabe und konvertiert sie in eine einzelne Zeichenfolge. Wenn Sie Eingabeobjekte einzeln konvertieren möchten, müssen Sie sie einzeln verarbeiten.Dies wurde in PowerShell v3 behoben:
http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/03/19/Counting-objects-in-PowerShell-3.0.aspx
Nebenbei können Sie mithilfe eines Platzhalters feststellen, ob ein Name etwas enthält:
quelle
Beachten Sie den Unterschied zwischen diesen beiden Ergebnissen:
Der Punkt ist, dass das 'Unboxing' durch die Pipe-Operation erledigt wird. ConvertTo-Json sieht das Objekt weiterhin als Array, wenn InputObject anstelle von Piping verwendet wird.
quelle