PowerShell作用域标识符
我是一个PowerShell新手,试图更好地理解scopes。是否有方法从范围内识别范围?某个变量或函数会给我范围名称、范围Guid或某种类型的范围Id 例如,我如何知道局部范围是否是全局范围 例如,我如何知道局部范围是否是全局范围PowerShell作用域标识符,powershell,scope,Powershell,Scope,我是一个PowerShell新手,试图更好地理解scopes。是否有方法从范围内识别范围?某个变量或函数会给我范围名称、范围Guid或某种类型的范围Id 例如,我如何知道局部范围是否是全局范围 例如,我如何知道局部范围是否是全局范围 $PSHOME是一个with选项AllScope,因此根据定义,它存在于每个范围中。它还具有选项常量,这意味着它既不能删除也不能修改 通过请求从父范围-scope 1检索此变量,如果您在全局范围内,操作将失败,因为全局范围是整个范围层次结构的根,因此没有父范围 结果
$PSHOME
是一个with选项AllScope
,因此根据定义,它存在于每个范围中。它还具有选项常量
,这意味着它既不能删除也不能修改
通过请求从父范围-scope 1
检索此变量,如果您在全局范围内,操作将失败,因为全局范围是整个范围层次结构的根,因此没有父范围
结果是:
- 如果不在全局范围内,则
调用将成功并返回一个非空字符串(PowerShell的主路径)Get Variable
- 布尔值将该字符串强制为布尔值(
),其计算结果为[bool]
,假设非空字符串被视为$false
(不考虑其内容)并应用了否定$true
- 布尔值将该字符串强制为布尔值(
- 如果您在全局范围内,尝试访问
会导致语句终止错误,从而触发语句的-scope 1
块catch
- 由于
块不执行任何操作,因此其行为类似于表达式上下文中的catch
$null
将-not
强制为布尔值$null
在布尔上下文中是$null
,因此使用$false
的否定运算结果为-not
,表示代码在全局范围内运行$true
- 由于
注:此答案的原始形式建议
(Get-PSCallStack).Count-eq 1
作为测试;以相反顺序输出描述当前作用域调用链的实例。
因此,此测试无法通过检测在全局范围内运行。请参阅我的大幅重写答案,它现在显示了一个更健壮的测试。
[bool] $isGlobalScope = -not $(try { Get-Variable -Scope 1 PSHOME } catch { })