Является ли ForEach действительно псевдонимом ForEach-Object (Powershell) - PullRequest
1 голос
/ 03 февраля 2020

ForEach задокументировано как псевдоним ForEach-Object. Когда я использую Get-Alias ForEach, он говорит, что он находится в псевдониме ForEach-Object.

Но,

  • ForEach-Object Принимает параметры, такие как Begin Process и End, где ForEach не принимает их.

    • Когда мы вызываем ForEach-Object без каких-либо вещей, он запрашивает параметр Process, а при вызове ForEach оставляет вложенное приглашение с >>.

    • % и ForEach ведут себя одинаково, но ForEach-Object нет.

Вот мои вопросы:

  • Является ли ForEach псевдонимом ForEach-Object?

  • Что лучше, ForEach или ForEach-Object?

Пожалуйста, поделитесь своими мыслями.

Спасибо!

1 Ответ

2 голосов
/ 03 февраля 2020

Существует две различные базовые конструкции :

  • ForEach-Object командлет

    • Этот командлет имеет встроенный псевдоним name: foreach, который, как и следовало ожидать, совпадает с именем отдельного оператора foreach (см. Следующий пункт) .
  • Оператор foreach l oop (похож на менее используемый оператор for).

То, к чему относится foreach, зависит от контекста синтаксического анализа - см. about_Parsing:

  • В режиме аргумента (в контексте команды ) foreach является псевдонимом ForEach-Object.

  • В режиме выражения (точнее: оператор режим в данном случае), foreach - это foreach l oop оператор .


В качестве командлета , ForEach-Object работает на конвейерный ввод .

Как оператор языка , foreach l oop работает с переменными и выражениями (который может включать выходные данные, собранные из команд).

  • Используйте его для эффективной обработки результатов, уже собранных в памяти, через self -выбрать переменную итератора (например, $num in foreach ($num in 1..3) { ... }); делает это заметно быстрее , чем обработка с помощью ForEach-Object.

  • Обратите внимание, что вы не можете отправлять выходные данные из оператора foreach непосредственно в конвейер, потому что грамматика PowerShell не позволяет этого; для потоковой передачи вывода в конвейер оберните оператор foreach в & { ... }. (Напротив, простые выражения (например, 1..3) могут быть отправлены непосредственно в конвейер).

Для получения дополнительной информации, сравнение производительности и обсуждение компромиссов (использование памяти и производительность), включая .ForEach() метод массива , см. этот ответ .

...