如何确定给定的 PSProvider 是否使用变量语法,例如 $env:

Pau*_*l π 4 powershell

简而言之,有没有办法从 shell 确定PSProvider 的路径是否有伴随变量,如果有,该变量的名称是什么?此处列出了支持此表示法的内置 PowerShell 提供程序,但我指的是一般提供程序 - 内置/第三方/自定义等。提供程序的驱动器名称(可以通过Get-PSProvider) 总是与其变量符号名称相同?


例如:

  • 环境提供程序使用Env:也可以使用其变量访问的驱动器$env:

  • 证书提供程序使用的Cert:驱动器也可以使用其变量进行访问$cert:,但没有实现IContentCmdletProvider 接口 - 如引用路径时在 shell 中触发的以下错误消息所示$Cert:xyz(但我可以使用CTRL+Space和tab自动完成$cert:路径)

    提供程序“证书”不能用于使用变量语法获取或设置数据。无法使用接口。该提供程序未实现 IContentCmdletProvider 接口。


这(下面引用)是否意味着每个提供程序的驱动器自动使用变量符号(并且始终具有相应的变量),但并非所有提供程序驱动器都能够通过提供程序的变量语法公开/操作其内容/项目?

“您可以使用美元 ($) 符号为提供程序路径添加前缀,并访问实现 IContentCmdletProvider 接口的任何提供程序的内容。”


最后,以下说法是否准确?
询问“是否有办法从 shell 确定 PSProvider 是否实现了IContentCmdletProvider接口?” 可能不足以确定是否可以使用其变量符号来访问/操作提供者的驱动器内容。

mkl*_*nt0 6

PowerShell 的命名空间变量表示法适用于:

要列出给定会话中支持此表示法的驱动器(基于底层提供程序的功能),请使用以下命令:

Get-PSDrive |
  Where-Object { 
    $_.Provider.Implementingtype.GetInterfaces() -contains [System.Management.Automation.Provider.IContentCmdletProvider] 
  }
Run Code Online (Sandbox Code Playgroud)

要列出支持此表示法的提供程序,每个提供程序可能位于当前会话中任意数量的驱动器(包括没有)(.Drives每个输出对象的属性包含该提供程序支持的当前驱动器的列表):

Get-PSProvider |
  Where-Object { 
    $_.Implementingtype.GetInterfaces() -contains [System.Management.Automation.Provider.IContentCmdletProvider] 
  }
Run Code Online (Sandbox Code Playgroud)

至于你的问题:

这(下面引用)是否意味着每个提供程序的驱动器自动使用变量符号(并且始终具有相应的变量),但并非所有提供程序驱动器都能够通过提供程序的变量语法公开/操作其内容/项目?

事实上:虽然每个驱动器的项目都可以使用命名空间变量符号来寻址,但它仅适用于那些支持提供程序实现的驱动器IContentCmdletProvider,因为符号的唯一目的是访问提供程序项目的内容。

询问“是否有办法从 shell 确定 PSProvider 是否实现了 IContentCmdletProvider 接口?” 可能不足以确定是否可以使用其变量符号来访问/操作提供者的驱动器内容。

测试给定提供程序是否实现(如上所示)就足够了,假设该提供程序位于当前会话中的一个或多个实际驱动器的基础上,以访问项目(如 的输出所反映)。IContentCmdletProviderGet-PSDrive

PowerShell 附带预定义的驱动器;你可以定义额外的New-PSDrive