Rozważ następujący skrypt Powershell, który wyszukuje foldery w C: \ z „og” w nazwie:
PS C: \> (ls |% {$ _. Nazwa} |? {$ _. Zawiera („og”)}) PerfLogs Pliki programów setup.log
Teraz zawężam wyszukiwanie, aby uzyskać tylko jeden przedmiot:
PS C: \> (ls |% {$ _. Nazwa} |? {$ _. Zawiera („Prog”)}) Pliki programów
Dziwne jest to, że pierwsza operacja daje tablicę , podczas gdy druga operacja (która jest semantycznie tą samą operacją IMHO, więc powinna dać ten sam typ wyniku) daje ciąg . Można to zobaczyć w następującym wyniku:
PS C: \> (ls |% {$ _. Nazwa} |? {$ _. Zawiera („og”)}). Długość 3) PS C: \> (ls |% {$ _. Nazwa} |? {$ _. Zawiera („Prog”)}). Długość 13
Może to być bardzo irytujące, ponieważ najwyraźniej jest mniej folderów pasujących do „og” niż tych, które pasują do „Prog”.
Najwyraźniej PowerShell domyślnie „rozpakowuje” tablicę z jednym elementem do pojedynczego obiektu i nigdy nie otrzymujemy tablicy o długości 1. Wydaje się, że za każdym razem, gdy chcę policzyć wyniki nadchodzące przez potok, muszę sprawdzić, czy „ mam do czynienia z tablicą czy nie.
Jak mogę temu zapobiec? Jak sobie z tym radzisz?
źródło
$_.Contains
, to%{,,$_.Name}
działa ...Odpowiedzi:
I zero wyników pozycji do
$null
.Nie możesz
Użyj konstruktora tablic (
@(...)
), aby wymusić zwrot kolekcji (być może z zerowym lub jednym elementem):źródło
@(1) | ConvertTo-Json
nadal wraca1
zamiast[1]
.ConvertTo-Json
nigdy nie zwraca kolekcji: odczytuje całe dane wejściowe i konwertuje na pojedynczy ciąg. Jeśli chcesz indywidualnie konwertować obiekty wejściowe, musisz przetworzyć każdy z nich osobno.Zostało to rozwiązane w PowerShell v3:
http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/03/19/Counting-objects-in-PowerShell-3.0.aspx
Na marginesie możesz sprawdzić, czy nazwa zawiera coś za pomocą symbolu wieloznacznego:
źródło
Zwróć uwagę na różnicę między tymi dwoma wynikami:
Chodzi o to, że „rozpakowywanie” odbywa się za pomocą operacji potoku. ConvertTo-Json nadal widzi obiekt jako tablicę, jeśli używamy InputObject zamiast potokowania.
źródło