【发布时间】:2019-11-28 01:09:27
【问题描述】:
我是 PowerShell 新手,试图更好地理解作用域。有没有办法从范围内识别范围?一些变量或函数会给我某种范围名称或范围 Guid 或范围 ID 吗?
例如,我如何知道本地范围是否为全局范围?
【问题讨论】:
-
请看我大大重写的答案,现在显示了一个更强大的测试。
标签: powershell scope
我是 PowerShell 新手,试图更好地理解作用域。有没有办法从范围内识别范围?一些变量或函数会给我某种范围名称或范围 Guid 或范围 ID 吗?
例如,我如何知道本地范围是否为全局范围?
【问题讨论】:
标签: powershell scope
例如,我如何知道本地范围是否为全局范围?
[bool] $isGlobalScope = -not $(try { Get-Variable -Scope 1 PSHOME } catch { })
$PSHOME 是带有选项AllScope 的automatic 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在全局范围内运行。
【讨论】: