Результат такой, каким он должен быть, но он показан несколько раз (я думаю, столько же строк в CSV).
Действительно: учитывая, что вы зациклилисьДля объектов, импортируемых из строк CSV по отдельности, оператор if
оценивается для каждого .
. Используйте break
для выхода из цикла, когда вы нашли совпадение вif
и elseif
ответвляются , чтобы исправить это (но не в else
ветви, потому что он потенциально должен ждать, пока все объекты будут проверены, чтобы сделать вывод, что совпадение не былонайдено).
Предостережение : Используйте break
только в foreach
цикле (утверждение) (как в вашем вопросе), а не в конвейер с командлетом ForEach-Object
(как в принятом ответе ).В последнем случае break
ищет вмещающий цикл в стеке вызовов, и если он не находит ни одного, завершает сценарий целиком .
Короче: Используйте только когда-либо break
и continue
в циклах (foreach
, while
, ...) или switch
операторов ;break
и continue
совершенно не связаны с конвейерами (но вы можете использовать return
в блоке сценария ForEach-Object
для перехода к входному объекту конвейера next ).
Начиная с PowerShell v7, прямой поддержки выхода из (10) * конвейера по требованию нет;добавление такой поддержки запрашивается в этом выпуске GitHub .
Однако намного проще и эффективнее воспользоваться -in
Оператор PowerShell, оператор проверки членства в массиве (сдерживание) (PSv3 +; в PSv2 или, альтернативно, используйте -contains
, где порядок операнда обращен), который позволяет вам выполнить single тест (для каждого значения сравнения) по всем строкам CSV , как также показано в полезный ответ Олафа .
Упрощенный пример:
Примечание: Приведенный ниже код сначала считывает все данные CSV в память, а затем создает из нее два массива для значений в двух столбцах.Для файла со списком имен это не должно быть проблемой памяти;однако при работе с большими наборами входных данных вам может потребоваться решение, которое обрабатывает входной файл CSV строка за строкой в конвейере.
# Parse sample CSV input into objects with .Zenskie and .Meskie properties.
$names = @'
Zenskie;Meskie
Ada;Aaron
Adamina;Abdon
Adela;Abel
'@ | ConvertFrom-Csv -Delimiter ';'
# Extract the male and female names into individual arrays.
# Note how no quoting is needed to acces the properties (columns) by names
# and how accessing a property on the input array ($names) automatically
# returns the property values *from all array elements*, a feature known
# as member enumeration.
$maleNames = $names.Meskie
$femaleNames = $names.Zenskie
# Test a few sample names.
'Abdon', 'Bogna', 'Adela', 'Bill' | ForEach-Object {
if ($_ -eq 'Bogna') { # exception
"Pocałuj mnie!! :)"
}
elseif ($_ -in $maleNames) { # -in tests presence in the array, case-insensitively
"$_, you are a man."
}
elseif ($_ -in $femaleNames) {
"$_, you are a woman."
}
else {
"$_, you have an odd name."
}
}
Выше приведено:
Abdon, you have are a man.
Pocałuj mnie!! :)
Adela, you have are a woman.
Bill, you have an odd name.