我是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]
实例,这些实例以相反的顺序描述对当前范围的调用链。 但是,此测试不会通过点源检测全局范围内的运行。