PowerShell作用域标识符

PowerShell作用域标识符,powershell,scope,Powershell,Scope,我是一个PowerShell新手,试图更好地理解scopes。是否有方法从范围内识别范围?某个变量或函数会给我范围名称、范围Guid或某种类型的范围Id 例如,我如何知道局部范围是否是全局范围 例如,我如何知道局部范围是否是全局范围 $PSHOME是一个with选项AllScope,因此根据定义,它存在于每个范围中。它还具有选项常量,这意味着它既不能删除也不能修改 通过请求从父范围-scope 1检索此变量,如果您在全局范围内,操作将失败,因为全局范围是整个范围层次结构的根,因此没有父范围 结果

我是一个PowerShell新手,试图更好地理解scopes。是否有方法从范围内识别范围?某个变量或函数会给我范围名称、范围Guid或某种类型的范围Id

例如,我如何知道局部范围是否是全局范围

例如,我如何知道局部范围是否是全局范围

$PSHOME
是一个with选项
AllScope
,因此根据定义,它存在于每个范围中。它还具有选项
常量
,这意味着它既不能删除也不能修改

通过请求从父范围
-scope 1
检索此变量,如果您在全局范围内,操作将失败,因为全局范围是整个范围层次结构的根,因此没有父范围

结果是:

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

    • 布尔值将该字符串强制为布尔值(
      [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 { })