2009-03-01 2 views
2

Вот мой код:

# 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 
--------------- 

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

Мой вопрос, почему не $ арг видны в удовольствие?

ответ

1

Кажется, что $ args имеет область действия «сценарий». Существует три области: локальный, глобальный и сценарий.

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

function fun 
{ 
    Write-Host $script:args 
} 

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

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

2

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

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

+0

Приятно догадаться, но это не может быть прав. Если вы модифицируете удовольствие для принятия аргумента, Write-Host по-прежнему не выводит результат. –

+0

О, $ args действительно ссылается на аргументы функции, НО кажется, что если функция имеет список параметров (например, function ($ x) {...}), то $ args не будут назначены, что я считаю несколько противоречит интуиции. –

+1

Я думаю, что вы неправильно понимаете цель $ args. $ args хранит любые «неперехваченные» аргументы. Если вы определяете параметры в скрипте или функции, PowerShell попытается связать с ними аргументы. Все, что он не может связать, закончится в $ args. – JasonMArcher

4

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

Возьмет следующее, например:.

# \ тест-args.ps1

функции Foo {Write-хост "функция печати` $ арг $ ARGS"}

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

написать-хост "печать скрипт` $ ARGS $ ARGS"

# функция печати Args

Foo привет мир ...

# конец сценария
+0

Yup. Вы можете думать, что $ args действует как $ _. Все зависит от того, в каком контексте вы его используете. – JasonMArcher

+0

$ args становится доступным, если func не имеет именованных параметров или когда счетчик аргументов равен -gt с именем params count, то есть если у вас есть функция с двумя параметрами, и вы отправляете 4 аргумента, то $ args содержит последние 2. –

Смежные вопросы