PowerShell 范围标识符



我是PowerShell新手,试图更好地理解作用域。 有没有办法从范围内识别范围?一些变量或函数会给我范围名称或范围 Guid 或某种范围 ID ?

例如,我怎么知道本地范围是否是全局范围?

例如,我怎么知道本地范围是否是全局范围?

[bool] $isGlobalScope = -not $(try { Get-Variable -Scope 1 PSHOME } catch { })

$PSHOME是一个带有选项AllScope的自动变量,所以根据定义,它存在于每个范围内。它也有选项Constant,这意味着它既不能删除也不能修改。

通过要求Get-Variable作用域检索此变量,-Scope 1,如果在全局作用域中,则操作将失败,因为全局作用域是整个作用域层次结构的根,因此没有父级。

结果是:

  • 如果不在全局范围内,则Get-Variable调用成功并返回非空字符串(PowerShell 的主路径(。

    • 布尔-not运算符将该字符串强制转换为布尔值([bool](,其计算结果为$false,因为非空字符串被认为是$true(无论其内容如何(并应用否定。
  • 如果在全局范围内,则尝试访问-Scope 1会导致语句终止错误,从而触发try/catch/finally语句的catch块。

    • 由于catch块不执行任何操作,因此它的行为类似于表达式上下文中的$null
    • -not强制$null布尔值。$null在布尔上下文中$false,因此-not的求反计算结果为$true,表示代码在全局范围内运行。

注意:线程/后台作业和远程会话有自己的全局作用域,上面的测试无法区分它们。


注:本答的原始形式建议(Get-PSCallStack).Count -eq 1作为测试;Get-PSCallStack输出[System.Management.Automation.CallStackFrame]实例,这些实例以相反的顺序描述对当前范围的调用链。 但是,此测试不会通过点源检测全局范围内的运行。

最新更新