我今天在 Powershell 5.1 中使用选项卡自动完成作为变量名,并注意到其中一个选项是 PSDrive 的名称。驱动器名称是docs
,我想扩展的是$document_name
. 当我输入$do<tab>
时,shell 确实扩展了我输入的内容,$document_name
但由于某种原因,我再次输入<tab>
了第二次,这时扩展的文本变为$docs:
.
我进一步探索并发现我的每个 PSDrives 都存在这种类型的变量,或者至少选项卡扩展表明它确实存在。
更正式地说,对于每个 PSDrive PSD,选项卡扩展认为这$PSD:
是一个有效的事情。
我的问题很简单:这些到底是什么?以下是我到目前为止所做的一些观察:
- 这些名称以 为前缀
$
,因此它们看起来像 PS 变量。对于本次讨论的其余部分(以及在前面的讨论中),我将假设它们是变量并这样引用它们。 - 尽管它们看起来是变量,但它们并没有
Variable:
像大多数变量一样在 PSDrive 中列出。这样,它的行为就像$env
“变量”,也没有在Variable:
. 我有一种感觉,如果我能找到关于 的文档$env
,那么我也会理解这些对象。 - 在某些方面,它们的行为类似于指向文件系统对象的指针。例如,如果有一个
readme.txt
包含文本“Hello, world!”的文件名。在名为 的 PSDrive 上code
,则以下所有内容都是与 Powershell 的可能交互。
获取文件的内容。
λ ${code:\readme.txt}
Hello, world!
只是为了证明上述结果的类型是String
:
λ ${code:\readme.txt} | % { $_.GetType().Name }
String
尝试将其用作对 PSDrive 的引用对于许多操作都不起作用,例如cd
:
C:\
λ cd ${code:}
At line:1 char:4
+ cd ${code:}
+ ~~~~~~~~
Variable reference is not valid. The variable name is missing.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : InvalidBracedVariableReference
我可以继续,但我很难过。如果我通过$code:
(或者$env:
,就此而言)到Get-Member
,我会收到一个错误消息Variable reference is not valid
。
那么到底什么是“变量”$env
和$<PSDrive>:
(例如$code:
)?它们是表达式吗?内置表达式?某种对象?谢谢你的帮助。