我今天在 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:)?它们是表达式吗?内置表达式?某种对象?谢谢你的帮助。