在我一直在研究的日志文件中:
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:?
和$?
,它们的功能都相同。