Непонятная оценка $ args в PowerShell

Переменная $ args по определению должна содержать все аргументы, передаваемые функции скрипта. Однако, если я построю конвейер внутри своей функции, переменная $ args будет иметь значение null. Кто-нибудь знает почему?

См. Этот пример:

function test { 1..3 | % { echo "args inside pipeline: $args" } ; echo "args outside pipeline: $args" }

Это результат при передаче параметра "hello":

PS> test hello
args inside pipeline:
args inside pipeline:
args inside pipeline:
args outside pipeline: hello

Есть ли для этого конкретная причина? Я знаю, как обойти это, но мне интересно, может ли кто-нибудь из сторонних источников объяснить причину этого.

Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
3
0
798
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В каналах используется $ input. Попробуй это:

function test { 1..3 | % { echo "args inside pipeline: $input" } ; echo "args outside pipeline: $args" }

Хорошо спасибо. Однако все же я бы сказал, что это очень странное поведение. И, по словам разработчиков, они очень старались создать его, используя принцип наименьшего сюрприза;)

driAn 16.01.2009 20:34

Чтобы объяснить, что здесь происходит, $ args содержит все не захваченные (за неимением лучшего термина) аргументы команды. В вашем примере конвейера вы запрашиваете оставшееся больше $ args из команды ForEach-Object (%), потому что это контекст, в котором будет оцениваться блок скрипта.

JasonMArcher 22.02.2009 22:42

То же самое происходит и с автоматической переменной $ _. Вам нужно смотреть, в каком контексте это находится.

JasonMArcher 22.02.2009 22:43

Другие вопросы по теме