Powershell "private"范围似乎根本没有用

标签 powershell scope private

我有下面的脚本,来自互联网:

$private:a = 1
Function test  {
    "variable a contains $a"
    $a = 2
    "variable a contains $a"
}
test

它打印 2。没问题。如果我删除“私有(private)”,如下所示:
$a = 1
Function test  {
    "variable a contains $a"
    $a = 2
    "variable a contains $a"
}

它仍然打印“2”。好像没什么区别。您能否提供一个关于“私有(private)”范围如何影响结果的快速示例?

谢谢。

最佳答案

在编写调用用户提供的回调的函数时,私有(private)范围会很有用。考虑这个简单的例子:

filter Where-Name {
    param(
        [ScriptBlock]$Condition
    )
    $FirstName, $LastName = $_ -split ' '
    if(&$Condition $FirstName $LastName) {
        $_
    }
}

然后,如果有人这样称呼它:
$FirstName = 'First2'
'First1 Last1', 'First2 Last2', 'First3 Last3' |
  Where-Name {param($a, $b) $a -eq $FirstName}

他们只希望看到 First2 Last2行,但实际上这将打印所有三行。
这是因为 $FirstName 上的冲突多变的。
为防止此类冲突,您可以在 Where-Name 中声明变量。作为私有(private):
filter Where-Name {
    param(
        [ScriptBlock]$private:Condition
    )
    $private:FirstName, $private:LastName = $_ -split ' '
    if(&$Condition $FirstName $LastName) {
        $_
    }
}

现在 $FirstNameWhere-Name不隐藏$FirstName$Condition 引用时在外部范围内脚本块。

关于Powershell "private"范围似乎根本没有用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36346817/

相关文章:

c# - 如何正确设置执行子 powershell 脚本的路径?

powershell - 仅从 PowerShell 中的路径获取驱动器号

try block 中的 JavaScript 作用域

javascript - 如何在 JavaScript 中创建全局变量?

objective-c - 如何在命名类别中声明私有(private)属性?

c++ - 使用公共(public)成员函数访问私有(private)成员变量时出错 : Variable "was not declared in this scope"

python - python类中私有(private)变量的实际实现

arrays - Select-Object -Unique返回String而不是String数组

powershell - 如何在Powershell中逐字读取文件?

javascript - 检查变量是否设置在全局范围内?