Доступ к переменным, созданным внутри функции после выполнения функции - PullRequest
4 голосов
/ 01 января 2012

Я использую функцию, которая создает некоторые переменные, которые я хотел бы использовать после обработки функции. Я пытался получить к ним доступ напрямую, но не могу. Как бы я поступил так?

Ответы [ 3 ]

9 голосов
/ 01 января 2012

Переменные внутри функций не сохраняются после запуска функции. Если вы хотите получить к ним доступ после обработки функции, добавьте к ним префикс модификатора области.

PS> function test-var{ $script:var='foo' }
PS> test-var # excute the function
PS> $var #print var
foo

Введите это в своей консоли для получения дополнительной информации:

PS> Get-Help about_Scopes
6 голосов
/ 02 января 2012

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

Это из википедии глобальная переменная страница:

Они обычно считаются плохой практикой именно из-за их нелокальности: глобальная переменная потенциально может быть изменена из любого места (если они не находятся в защищенной памяти или иным образом предоставляются только для чтения), и любая часть программы может зависеть от нее[1].Поэтому глобальная переменная обладает неограниченным потенциалом для создания взаимных зависимостей, а добавление взаимных зависимостей увеличивает сложность.

Некоторые альтернативы:

  • Создание функции вернуть данные, необходимые вызывающей стороне.Функции Powershell, как правило, должны возвращать данные, относящиеся к существительному, в функции Powershell соглашение об именах глагола - Существительное .Если вам нужно вернуть другие данные, не связанные с существительным, подумайте о создании второй функции.

    function Get-Directories {
        param ([string] $Path)
    
        # Code to get or create objects here.
        $dirs = Get-ChildItem -Path $Path | where {$_.PsIsContainer}
    
        # Explicitly return data to the caller.
        return $dirs
    }
    
    $myDirs = Get-Directories -Path 'C:\'
    
  • Используйте справочную переменную .Ссылка передает адрес переменной в памяти функции.Когда функция изменяет данные переменной, она будет доступна вне функции, но область действия переменной не изменится.

    function Get-Directories {
        param ([string] $Path, [ref] $Directories)
        $Directories.Value = Get-ChildItem -Path $Path | where {$_.PsIsContainer}
    }
    
    $myDirs = $null
    Get-Directories -Path 'C:\' -Directories ([ref] $myDirs)
    

Надеюсь, это поможет.Удачного кодирования: -)

3 голосов
/ 02 января 2012

Если вы запускаете свою функцию с помощью. функция будет выполняться в вашей области видимости, и все переменные, определенные в функции, будут доступны вызывающей стороне.

т.е.

. $func
$myPrivateVariable # Now Set in the parent scope.

Если функция находится в модуле, вы также можете использовать этот вид трюка для доступа к области видимости модуля:

$m  =Get-Module myModule
. $m { $myPrivateModuleVariable  }

Надеюсь, это поможет

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