Я пришел из Python, где, если я захочу сослаться на объект, который я сейчас перебираю, я могу сделать это очень просто -
for object in list:
print(object)
прямым эквивалентом этого в PowerShell является оператор foreach
(цикл) :
$list = 1..3 # create a 3-element array with elements 1, 2, 3
foreach ($object in $list) {
$object # expression output is *implicitly* output
}
Обратите внимание, что вы не можете напрямую использовать оператор foreach
в конвейере PowerShell .
В конвейере необходимо использовать ForEach-Object
командлет вместо , который - несколько запутанно - может также именоваться foreach
через псевдоним -только режим синтаксического анализа различает оператор и псевдоним командлета.
Вы используете ForEach-Object
командлет в конвейере , где применяются другие правила .
Блоки сценариев ({ ... }
) передаются конвейерной обработке командлетов , напримеркак ForEach-Object
и Where-Object
сделать не имеет явную переменную итерации, которую обеспечивает оператор foreach
.
Вместо этого, как правило, такие скриптовые блоки видят текущий входной объект конвейера как автоматическая переменная $_
- или, более подробно, как $PSItem
.
В то время как оператор foreach
и командлет ForEach-Object
работают на одном уровне абстракции одинаково, есть принципиальная разница :
Оператор foreach
работает с коллекциями , собранными сразу в памяти, полностью .
Командлет ForEach-Object
работает на потоковом вводе, объект за объектом , поскольку каждый объект принимается по конвейеру.
Эта разницасоставляет следующий компромисс :
Использование оператора foreach
для лучшей производительности за счет памятииспользование .
Использование ForEach-Object
командлет для постоянное использование памяти и, возможно, также для синтаксическая элегантность одного конвейера за счет производительности - однако для очень больших входных наборов это может быть единственным вариантом (при условии, что вы также не собираете очень большой набор данных в памятина вывод ).