Я пытаюсь создать простую функцию для создания переменных в powershell с сгенерированным именем.
Я использую этот код:
function createAnewVariable {
[CmdletBinding()]
Param(
[String]$Name
)
New-Variable -Name GenLink$Name -Value "AMIGA" -Option AllScope
}
createAnewVariable -Name "AutoVAR"
Вне функции она работает отлично, когда я делаю переменную get, я вижу свои автоматически созданные переменные, такие как $GenLinkName но внутри функции у меня нет доступа к переменной в списке, и я не могу ее вызвать! оо
Это может быть просто, но я не понимаю, почему :)
Кто-нибудь может сказать мне, где я ошибаюсь, пожалуйста?
Переменные в PowerShell являются ограниченный и по умолчанию для текущей локальной области, т.е. тело функции. Параметр AllScope
не делает его доступным для предшествующих областей, он просто обеспечивает PowerShell копии переменную в любой новой дочерней области, созданной из текущей области.
Чтобы сделать переменную доступной в родительской области, используйте -Scope 1
при вызове New-Variable
:
function createAnewVariable {
[CmdletBinding()]
Param(
[String]$Name
)
New-Variable -Name "GenLink$Name" -Value "AMIGA" -Scope 1
}
createAnewVariable -Name "AutoVAR"
# This is now available in the calling scope
$GenLinkAutoVAR
Имейте в виду, что если функция относится к области модуля (например, функция является частью модуля), родительской областью будет область действия модуля, что означает, что все другие функции в том же модуле также смогут ее видеть.
Из области модуля можно использовать
$PSCmdlet.SessionState.PSVariable.Set()
для установить переменную в области вызывающего абонента.