脚本参数作为私有范围变量
Script argument as private scope variable
我可以在脚本中有一个参数,它默认成为一个全局变量,就像这样
param (
[string]$argument
)
但貌似我无法像这样控制那个变量的范围
param (
[string]$private:argument
)
在一个复杂的脚本中,主脚本中有很多函数,模块中还有其他函数,将参数限制为 Private 似乎是个好习惯,但我似乎不知道该怎么做。
如果我没有正确理解您的顾虑,您的脚本中有许多脚本块或函数,您担心重复使用变量名(在本例中 argument
)会导致混乱脚本级参数的值。
你不用担心!
至少如果你合理地设计你的函数就不会:)
让我们看一个示例脚本:
param(
$argument
)
function innerFunction
{
param(
$innerArgument
)
# Now let's write to a new variable, the name of which collides with the script parameter
$argument = $innerArgument + " and some more stuff"
Write-Host "`$argument inside innerFunction: '$argument'"
}
Write-Host "`$argument in script: '$argument'"
innerFunction -innerArgument $argument
Write-Host "`$argument in script: '$argument'"
现在,如果我们像这样将其存储在 test.ps1
和 运行 中:
.\test.ps1 -argument "original argument"
我们将看到脚本级 $argument
变量完全不受我们分配给 innerFunction
:
中同名变量的影响
$argument in script: 'original argument'
$argument inside innerFunction: 'original argument and some more stuff'
$argument in script: 'original argument'
这是设计使然。当您尝试为 reading 解析一个变量时(例如,引用一个成员:$argument.Length
),PowerShell 将遍历范围层次结构,直到它找到一个适当命名的变量,或者它在没有找到任何东西的情况下到达了最顶层的范围(在非严格模式下有效地解析了对 $null
的变量引用)。
另一方面,当您尝试 写入 到一个变量时,如果不存在,PowerShell 将创建一个新的同名局部变量,除非您限定了它的范围($script:argument = ...
将覆盖这种写时复制行为)。
我可以在脚本中有一个参数,它默认成为一个全局变量,就像这样
param (
[string]$argument
)
但貌似我无法像这样控制那个变量的范围
param (
[string]$private:argument
)
在一个复杂的脚本中,主脚本中有很多函数,模块中还有其他函数,将参数限制为 Private 似乎是个好习惯,但我似乎不知道该怎么做。
如果我没有正确理解您的顾虑,您的脚本中有许多脚本块或函数,您担心重复使用变量名(在本例中 argument
)会导致混乱脚本级参数的值。
你不用担心!
至少如果你合理地设计你的函数就不会:)
让我们看一个示例脚本:
param(
$argument
)
function innerFunction
{
param(
$innerArgument
)
# Now let's write to a new variable, the name of which collides with the script parameter
$argument = $innerArgument + " and some more stuff"
Write-Host "`$argument inside innerFunction: '$argument'"
}
Write-Host "`$argument in script: '$argument'"
innerFunction -innerArgument $argument
Write-Host "`$argument in script: '$argument'"
现在,如果我们像这样将其存储在 test.ps1
和 运行 中:
.\test.ps1 -argument "original argument"
我们将看到脚本级 $argument
变量完全不受我们分配给 innerFunction
:
$argument in script: 'original argument'
$argument inside innerFunction: 'original argument and some more stuff'
$argument in script: 'original argument'
这是设计使然。当您尝试为 reading 解析一个变量时(例如,引用一个成员:$argument.Length
),PowerShell 将遍历范围层次结构,直到它找到一个适当命名的变量,或者它在没有找到任何东西的情况下到达了最顶层的范围(在非严格模式下有效地解析了对 $null
的变量引用)。
另一方面,当您尝试 写入 到一个变量时,如果不存在,PowerShell 将创建一个新的同名局部变量,除非您限定了它的范围($script:argument = ...
将覆盖这种写时复制行为)。