Powershell пропускает элемент в массиве, если он пуст - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть скрипт powershell, где я получаю имена элементов в качестве переменных от Jenkins:

$IISarray = @("$ENV:Cashier_NAME", "$ENV:Terminal_NAME", "$ENV:Content_Manager_NAME", "$ENV:Kiosk_BO_NAME")

foreach ($string in $IISarray){
"some code goes here"
}

Иногда случайные элементы могут быть пустыми. Как я могу добавить проверку, чтобы видеть, является ли текущий элемент в массиве пустым, пропустить его и перейти к следующему элементу?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018
# you can skip the `@` and brackets as well as the quotation marks
$IISarray = $ENV:Cashier_NAME, $ENV:Terminal_NAME, $ENV:Content_Manager_NAME, $ENV:Kiosk_BO_NAME

foreach($String in $IISarray) {
    # trim the strings and check the length
    if($String.Trim().Length -gt 0) {
        "some code goes here"
    }
}
0 голосов
/ 13 ноября 2018

Вы можете использовать Where-Object, чтобы отфильтровать нулевые или пустые значения. Это очень часто используется, поэтому ? это сокращение от Where-Object.

$IISarray = @("$ENV:Cashier_NAME", "$ENV:Terminal_NAME", "$ENV:Content_Manager_NAME", "$ENV:Kiosk_BO_NAME")

foreach ($string in ($IISarray | ? {$_})){
"some code goes here"
}

$_ - это автоматическая переменная, представляющая каждый входящий объект в конвейере. И $null, и пустая строка '' являются ошибочными в Powershell, поэтому только непустые значения длиной> 0 будут переданы в цикл for.

0 голосов
/ 13 ноября 2018

Проще использовать -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($_)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...