Powershell - 为什么$ ENV | GET-MEMBER不起作用?

时间:2016-07-03 10:54:03

标签: powershell

我来自C,C ++,C#,python背景,所以我将这个思维模式应用到Powershell,我正在从头学习但是我有点困惑,因为乍一看似乎是不一致的并且不遵循所有对象的固定基类类型结构,以便可以以一致的方式查询事物。

以下工作正常:

   $host | get-member
   $env:username

所以$ env是一个有效的对象,但这不起作用:

   $env | get-member

这些也行不通:

   $env.gettype()
   dir $env
   dir $env:

但$ host上的这种类型查询确实如此我假设$ host是一个.net变量但$ env不是?

   $host.gettype()

我发现env:也适用于dir(又名get-childitem),但是这个冒号是另一种我不熟悉的符号,现在事情开始变得非常混乱。在这种情况下,这似乎不是一个字符串格式,我已经看到一些谷歌帖子,所以这是什么?它的行为类似于成员选择或字典键说明符。如果它是成员选择器或字典键,那么我希望get-member能够工作,因为它是一个标准对象。

这会输出我想要的变量和值,但我不明白为什么使用这种语法。这不是DOS语法,所以这里发生了什么?

   dir env:

但是dir $ env似乎等同于dir $ env:userprofile ????为什么呢?

因此$ host似乎是一个.net对象,但$ env或env:是完全不同的东西,我不知道它在宏观方案中的对象类型是什么,似乎无法查询它的类型传统手段。最初的想法是它是一个列表对象,因为get-childitem可以使用它,但除此之外我完全迷失了。

我显然在这里遗漏了一些东西,所以有人可以引导我朝着正确的方向前进吗?

3 个答案:

答案 0 :(得分:3)

Get-Help 'about_Providers' -ShowWindowEnvironment Provider中显示env: 驱动,即Windows PowerShell providers中的一个。

  

内置提供程序:Windows PowerShell包含一组内置功能   您可以用来访问不同类型数据的提供程序   存储

Provider      Drive         Data store
--------      -----         ----------
Alias         Alias:        Windows PowerShell aliases
Certificate   Cert:         x509 certificates for digital signatures
Environment   Env:          Windows environment variables
FileSystem    *             File system drives, directories, and files
Function      Function:     Windows PowerShell functions
Registry      HKLM:, HKCU:  Windows registry
Variable      Variable:     Windows PowerShell variables
WSMan         WSMan:        WS-Management configuration information

* The FileSystem drives vary on each system. 
     

您也可以创建自己的Windows PowerShell提供程序   安装其他人开发的提供商。列出提供者   在会话中提供,请输入:get-psprovider

这就是Get-ChildItem env: dir $env: dir $env 等相反的原因。

答案 1 :(得分:3)

首先要注意的是,$env$env:username无关。 $env只是一个变量,通常它不存在,因为没有人给它任何东西。在变量名中使用冒号(如$env:username,但某些预定义前缀除外:global:script:local:private:variable:)是一种特殊语法,允许使用可变语法访问PowerShell提供程序项内容。它适用于实现内容cmdlet的任何PowerShell提供程序:${C:\Windows\System.ini}$function:prompt。该语法等同于为给定的PowerShell路径调用Get-ContentSet-Content

答案 2 :(得分:1)

我的2美分: 试试get-psdrive,你会得到类似的结果:

Name           Used (GB)     Free (GB) Provider      Root
Env                                    Environment

所以它似乎就像批量驱动程序一样。