Почему я не могу получить доступ к $ args из функции? - PullRequest
2 голосов
/ 01 марта 2009

Вот мой код:

# hi.ps1

function fun
{
    Write-Host $args
}

Write-Host '---------------'
Write-Host $args
Write-Host '---------------'
fun
Write-Host '---------------'

Это вывод:

PS C:\scratch> .\hi there jim
---------------
there jim
---------------

---------------

Мой вопрос: почему $ args не видны в веселье?

Ответы [ 4 ]

4 голосов
/ 01 марта 2009

Думайте о файле скрипта как о функции. Тело функции - это содержимое скрипта, а имя функции - имя файла скрипта. Когда вы отправляете аргументы в скрипт, они будут доступны в контенте скрипта. Когда вы отправляете аргументы в функцию, $ args будет доступен внутри функции.

Возьмем, к примеру, следующее:

#. \ test-args.ps1

function foo {write-host "функция печати` $ args $ args "}

# напечатать сценарий args

write-host "скрипт печати` $ args $ args "

# функция печати аргументов

foo hello world ...

# конец скрипта
2 голосов
/ 01 марта 2009

Из моего понимания powershell, $ args относится к аргументам текущей функции. При первом вызове Write-Host $ args ссылается на аргументы верхнего уровня. Внутри веселья вы ссылаетесь на аргументы веселья, которые не приведены.

См. Переменные PowerShell для получения дополнительной информации о переменных.

1 голос
/ 01 марта 2009

Похоже, что $ args имеет область действия "script". Существует три области действия: локальная, глобальная и сценарий.

Если функция изменяется следующим образом:

function fun
{
    Write-Host $script:args
}

Тогда это будет работать. «Script:» является оператором разрешения области («local:» является значением по умолчанию). Я нашел этот результат несколько экспериментально, и я не могу сказать, что точно знаю, в чем смысл области сценария, но кажется, что переменные в области сценария каким-то образом принадлежат самому сценарию.

Редактировать: Я принимаю свой собственный ответ как лучший, поскольку именно он решил мою проблему, но также см. Другие ответы и их комментарии для получения некоторой полезной информации.

0 голосов
/ 22 ноября 2013
$MyInvocation.UnboundArguments
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...