Проще использовать -ne ''
для создания отфильтрованной копии массива, которая исключает пустые записи , благодаря способности многих операторов PowerShell действовать как фильтр сLHS со значением массива.
Примечание. Я предполагаю, что вы хотите отфильтровать пустых строк , а не blank (все пробелы)), учитывая, что неопределенные переменные окружения расширяются до пустой строки.
# Sample array with empty elements.
# Note: No need for @(...)
$IISarray = "foo", "", "bar", "baz", ""
# Note the `-ne ''`, which filters out empty elements.
foreach ($string in $IISarray -ne ''){
$string # echo
}
Вышеприведенное приводит к:
foo
bar
baz
ответ Soundstripe предлагает решение Where-Object
, которое потенциально обеспечивает дополнительную гибкость за счет возможности указать произвольный блок сценария фильтра, но использование конвейера для этого случая использования немного сложновато.
К счастью, PSv4 + предлагает .Where()
коллекцию метод , который работает заметно лучше.
Позвольте мне продемонстрировать это с решение, которое также исключает пусто (все пробелы) элементы :
# Note the all-whitespace element, which we want to ignore too.
PS> ("foo", " ", "bar", "baz", "").Where({ $_.Trim() })
foo
bar
baz
Подобно командлету Where-Object
, вы передаете блок сценария методу .Where()
, внутри которого автоматическая переменная $_
представляет элемент вводапод рукой.
Метод .Trim()
обрезает начальный и конечный пробелы из строки и возвращает результат.
Строка, состоящая из всех пробелов, поэтому приводит к пустой строке .
В логическом контексте (как неявно есть блок сценария метода .Where()
), пустая строка оценивается как $false
, тогда как любая непустая строка $true
.
Однако вы можете выбрать явный ($_.Trim() -ne ''
) или даже использовать метод .NET ([string]::IsNullOrWhiteSpace($_)
).