PowerShell中的$<drivename>:(如`$code:`)是什么类型的对象? [英] What type of object is $<drivename>: (such as `$code:`) in Powershell?

查看:0
本文介绍了PowerShell中的$<drivename>:(如`$code:`)是什么类型的对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我今天在Powershell5.1中为变量名使用了制表符自动补全,注意到其中一个选项是PSDrive的名称。驱动器名为docs,我想要展开的驱动器名为$document_name。当我键入$do<tab>时,外壳确实将我键入的内容展开为$document_name,但由于某种原因,我再次键入<tab>,此时展开的文本变为$docs:

我进一步研究,发现我的每个PSDDrive都存在这种类型的变量,或者至少制表符展开表明它是存在的。

更正式地说,对于每个PSDrivePSD,制表符扩展认为$PSD:是正确的。

我的问题很简单:这些到底是什么?以下是我到目前为止的一些观察:

  • 这些名称以$为前缀,因此它们看起来像ps变量。对于本讨论的其余部分(以及前面的讨论),我将假定它们是变量,并将其引用为变量。
  • 虽然它们看起来是变量,但它们并不像大多数变量那样列在Variable:PSDrive中。在这种情况下,它的行为类似于$env"变量",Variable:中也没有列出。我有一种感觉,如果我能找到关于$env的文档,那么我也会理解这些对象。
  • 在某些方面,它们的行为类似于指向文件系统对象的指针。例如,如果有一个文件名readme.txt包含文本"Hello,world!"在名为code的PSDrive上,则以下所有内容都可能与PowerShell交互。
获取文件的内容。

λ  ${code:
eadme.txt}
Hello, world!

只是为了证明上述结果的类型为String

λ  ${code:
eadme.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:)究竟是什么"变量"?它们是表情吗?内置表达式?某种物体?谢谢你的帮助。

推荐答案

您看到的是命名空间变量表示法,这是一种基于变量的方式来访问PowerShell驱动器中项目的内容其基础提供程序实现了基于内容的访问(即实现了IContentCmdletProvider接口)。

一般语法为:

${<drive>:<path>}       # same as: Get-Content <drive>:<path>

${<drive>:<path>} = ... # same as: Set-Content <drive>:<path> -Value ...

如果<drive>名称和<path>都可以作为变量名称,则不需要将{...}括起来;例如:

$env:HOME  # no {...} needed

${env:ProgramFiles(x86)} # {...} needed due to "(" and ")"

实际上,从Windows PowerShell V5.1开始,以下盒装驱动器提供程序支持命名空间变量表示法

  • 环境(驱动器Env:)
  • 功能(驱动器Function:)
  • Alias(驱动器Alias:)
  • 文件系统(驱动器C:,...)
  • 变量(驱动器Variable:)-尽管实际上毫无意义,但默认情况下省略驱动器部分将访问变量(例如,$variable:HOME与仅$HOME相同)。

其中,Env:驱动器是迄今为止与命名空间变量表示法一起使用最频繁的,尽管大多数用户不知道环境变量引用(如$env:HOME)的基础是什么。

有时您会看到它与文件系统驱动器一起使用-例如,${c:foofile.txt}-但您只能使用文字路径,并且无法控制字符编码,这限制了它的用途。

然而,它允许有趣的用途;例如:

PS> $alias:foreach  # Get the definition of alias 'foreach'
ForEach-Object

PS> $function:prompt # Get the body of the 'prompt' function
"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) ";
# .Link
# https://go.microsoft.com/fwlink/?LinkID=225750
# .ExternalHelp System.Management.Automation.dll-help.xml

# Define a function foo that echoes 'hi' and invoke it.
PS> $function:foo = { 'hi' }; foo
hi

注意:

  • 由于${<drive>:<path>}${<drive>:<path>} = <value>等同于
    Get-Content -Path <drive>:<path>Set-Content -Path <drive>:<path> <value>,因此路径被解释为通配符表达式(因为-Path-LiteralPath相反),这可能会导致看起来像通配符的路径出现问题-有关示例和解决办法,请参阅this answer

    /li>
  • 撰写本文时,命名空间变量表示法尚未正式记录,但this GitHub issue建议这样做。

这篇关于PowerShell中的$&amp;lt;drivename&amp;gt;:(如`$code:`)是什么类型的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆