Переменная $ 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
Есть ли для этого конкретная причина? Я знаю, как обойти это, но мне интересно, может ли кто-нибудь из сторонних источников объяснить причину этого.

В каналах используется $ input. Попробуй это:
function test { 1..3 | % { echo "args inside pipeline: $input" } ; echo "args outside pipeline: $args" }
Чтобы объяснить, что здесь происходит, $ args содержит все не захваченные (за неимением лучшего термина) аргументы команды. В вашем примере конвейера вы запрашиваете оставшееся больше $ args из команды ForEach-Object (%), потому что это контекст, в котором будет оцениваться блок скрипта.
То же самое происходит и с автоматической переменной $ _. Вам нужно смотреть, в каком контексте это находится.
Хорошо спасибо. Однако все же я бы сказал, что это очень странное поведение. И, по словам разработчиков, они очень старались создать его, используя принцип наименьшего сюрприза;)