脚本参数作为私有范围变量

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 = ...将覆盖这种写时复制行为)。