【问题标题】:PowerShell Scope IdentifierPowerShell 范围标识符
【发布时间】:2019-11-28 01:09:27
【问题描述】:

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

例如,我如何知道本地范围是否为全局范围?

【问题讨论】:

  • 请看我大大重写的答案,现在显示了一个更强大的测试。

标签: powershell scope


【解决方案1】:

例如,我如何知道本地范围是否为全局范围?

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

$PSHOME 是带有选项AllScopeautomatic variable,因此根据定义,它存在于每个范围内。它还有Constant选项,这意味着它既不能删除也不能修改。

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

结果是:

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

    • 布尔值 -not operator 将该字符串强制转换为 布尔值 ([bool]),其计算结果为 $false,因为非空字符串被视为 $true(无论其内容如何)和应用否定。
  • 如果您全局范围内,访问-Scope 1 的尝试会导致statement-terminating 错误,这会触发@987654324 的catch 块@ 声明。

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

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


注意:此答案的原始形式建议(Get-PSCallStack).Count -eq 1 作为测试; Get-PSCallStack 输出 [System.Management.Automation.CallStackFrame] 实例,这些实例以相反的顺序描述了对当前作用域的调用链。 因此,然而,这个测试并没有检测到通过dot-sourcing在全局范围内运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多