Powershell - `$global:?` 是访问 `$?` 的有效方式吗,还是其他什么?

Powershell - `$global:?` 是访问 `$?` 的有效方式吗,还是其他什么?

在我一直在研究的日志文件中:

PS>$global:?
True

现在我知道这$?自动的变量,如上所述这里

我已经读过全球的变量这里

我不确定这是否$?算作全局变量以及自动变量。如果我打开了多个 Powershell 窗口,并且运行

PS>fakecommand

在第一个窗口中,则echo $?输出False。但是,如果我echo $?在第一个窗口中运行虚假命令后立即在另一个 Powershell 窗口中运行,则会得到True

在我看来(也许是错误的)这表明它并不是真正全球化的。

另一方面,$global:? 做过输出某物当我尝试使用一个我知道不存在的变量时:

PS>$global:underlay

没有输出。

那么:$global:?与 是同一个东西吗$??如果不是,那么什么时候用 来代替通常的 比较合适$?

答案1

$global:?$?

  • 技术上,否:此变量的副本存在在各个范围内(请参阅下文详细信息)。
  • 在实践中然而,永远只 $? 价值 而这反映的是成功状态最近在任何范围内执行语句($false如果发生至少一种任何类型的错误,否则)。$true

什么时候适合使用它来代替通常的$?

  • 从不: - 自动管理,只读 - 的值$?相同的在所有范围内。

背景信息:

自动$?变量是用AllScopes选项定义的(最初在全局范围内),这意味着:

  • 每当有新的后代 范围被创建,它接收自己的副本然而,该变量与原始变量共享其值,因此全部范围见相同(动态)值在技​​术上独立的$?副本中。[1]

要查看$?变量的所有属性,请使用Get-Variable如下所示 - 请注意Options输出行,它不仅显示AllScope,还显示ReadOnly,暗示$?无法设置由用户[2]

Get-Variable '`?' | Format-List

输出:

Value       : True
Name        : ?
Description : Status of last command
Visibility  : Public
Module      : 
ModuleName  : 
Options     : ReadOnly, AllScope
Attributes  : {}

笔记:

  • 变量名?必须作为 传递'`?',因为Get-Variable总是将其(位置隐含的)-Name参数解释为通配符表达式。因此,为了?使用字面上地`需要用 转义。

[1]$?确实被视为具有相同的值全部范围,甚至跨越模块边界。但一般来说,请注意每个模块都有自己的作用域(作用域堆栈,又称“会话状态”),以及AllScope来自外部一个模块或不同的模块是不是复制到给定的模块(因为给定模块的范围不是后人调用者作用域的变量
) 。AllScope全球的范围 - 原样$?- 是一种特殊情况:虽然这样的变量不是复制到模块,模块直接查看全局副本得益于 PowerShell 的动态作用域,因为模块链接到全局作用域,而无需后人后者。

[2] 然而,一些正在讨论用户代码设置此变量的机制 - 请参阅GitHub 问题 #10917
尽管你不应该能够做到,模块内部分配给$?,这将创建一个同名的常规模块局部变量(这是可能的,因为 - 如上一个脚注中所述 - 全局ReadOnly, AllScope选项变量是不是复制到模块)。但是,此分配的值仅可通过 获得Get-Variable '`?'` -ValueOnly,而查询$?- 尽管没有使用范围说明符 - 显然总是指的是全球的变量的副本。

答案2

我认为这$?只是忽略了这个上下文属性。

我已经测试了$global:?$private:?$?,它们的功能都相同。

相关内容