我将我的函数放在一个单独的文件中,然后用以下文件调用该文件:
$workingdir = Split-Path $MyInvocation.MyCommand.Path -Parent
. "$workingdir\serverscan-functions.ps1"
但是,如果我像
那样调用脚本my-function
变量范围(来自“my-function”)将如何? 我是否还应该使用$ script:变量来使变量存在于函数外部或者我是否也点了源函数?
希望我不要把任何人与我的问题混淆......我试图让它尽可能地理解,但仍然学习所有的基本概念,所以我觉得很难解释..
答案 0 :(得分:20)
当您点源代码时,它的行为就像该代码仍在原始脚本中一样。范围将与在一个文件中全部相同。
C:\ functions.ps1代码:
$myVariable = "Test"
function Test-DotSource {
$script:thisIsAvailableInFunctions = "foo"
$thisIsAvailableOnlyInThisFunction = "bar"
}
main.ps1代码
$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.
答案 1 :(得分:2)
为了达到你想要的效果,你可能需要创建一个模块。在模块中,使用Export-ModuleMember
导出函数,并且只要您没有显式地将任何变量导出为模块成员,您应该没问题。
创建模块后,使用Import-Module
cmdlet导入它。
答案 2 :(得分:1)
我的2点:
通常(在过去的安迪·阿里斯门迪回答之后!上帝保佑你们!)我将所有脚本保存在$pwd
文件夹中(在系统路径环境中添加)。我可以在没有点源的情况下从控制台调用它们,并且在脚本结束工作后没有脚本变量使控制台中毒。
如果你不能用简单的脚本修改你的功能(有时它会发生)我同意Trevor的回答来创建一个模块并将其导入$profile