Помещение функций в отдельный скрипт и их точечный источник - какова будет область видимости - PullRequest
10 голосов
/ 21 февраля 2012

Я поместил свои функции в отдельный файл, и я вызываю файл с помощью:

$workingdir = Split-Path $MyInvocation.MyCommand.Path -Parent
. "$workingdir\serverscan-functions.ps1"                        

Но, если я назову сценарии как

my-function

, как изменится переменнаяобласть (изнутри "моя функция") быть?Должен ли я по-прежнему $ script: variable, чтобы переменная существовала вне функции, или я также поставил точку в функции?

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

Ответы [ 3 ]

20 голосов
/ 21 февраля 2012

Когда вы ставите точки в исходном коде, он будет вести себя так, как если бы этот код был в исходном скрипте.Области действия будут такими же, как если бы все было в одном файле.

C: \ functions.ps1 code:

$myVariable = "Test"

function Test-DotSource {
    $script:thisIsAvailableInFunctions = "foo"
    $thisIsAvailableOnlyInThisFunction = "bar"
}

main.ps1 code

$script:thisIsAvailableInFunctions = ""

. C:\functions.ps1

# Call the function to set values.
Test-DotSource

$script:thisIsAvailableInFunctions -eq "foo" 
# Outputs True because of the script: scope modifier

$thisIsAvailableOnlyInThisFunction -eq "bar" 
# Outputs False because it's undefined in this scope.

$myVariable -eq "Test"                       
# Outputs true because it's in the same scope due to dot sourcing.
2 голосов
/ 22 февраля 2012

Чтобы достичь желаемого, вам, вероятно, потребуется создать модуль. В модуле экспортируйте функции, используя Export-ModuleMember, и до тех пор, пока вы явно не экспортируете какие-либо переменные как члены модуля, все будет в порядке.

После создания модуля импортируйте его с помощью командлета Import-Module.

1 голос
/ 22 февраля 2012

Мои 2цента:

Обычно (после прошлого ответа Энди Арисменди! Да благословит вас Бог!) Я сохраняю все свои сценарии в папке $pwd (добавлено в среде системного пути).Я могу вызывать их из консоли без точечных источников, и никакая переменная сценария не отравляет консоль после того, как сценарий завершает свою работу.

Если вы не можете изменить свои функции в простых сценариях (иногда это происходит), я согласен сОтвет Тревора на создание модуля и его импорт в $profile

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...