【问题标题】:Powershell - Why does $ENV | GET-MEMBER not work?Powershell - 为什么$ENV | GET-MEMBER 不起作用?
【发布时间】:2016-07-03 10:54:03
【问题描述】:

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

以下工作正常:

$主机 |获取成员 $env:用户名

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

 $env |获取会员

这些也不起作用:

$env.gettype() 目录 $env 目录 $env:

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

 $host.gettype()

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

这会输出我想要的变量和值,但我不明白为什么要使用这种语法。这也不是 DOS 语法,这是怎么回事?

 目录环境:

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

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

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

【问题讨论】:

  • 因为你没有$env 变量。 $env$env:something 是两个不同的不相关的东西。
  • 好的,正如我上面写的,如果 $env 不是变量,它是什么?似乎 env: 实际上是一个驱动器,但 $env 和 $env:username 是别的东西,我仍然不确定那是什么。
  • $env 是变量,但你没有变量,因为你没有给它赋值,比如$env = 'something'$env:username 等效于 Get-Content env:username,其中 env:username 是 PowerShell 提供程序项的 PowerShell 路径。它适用于任何实现内容 cmdlet 的提供程序:${C:\Windows\System.ini}$function:prompt
  • 啊,好吧,我明白你在说什么,但我觉得令人困惑的是 $env 在我的情况下确实没有设置任何东西,但 $env:username 确实有效。我很困惑,因为对我来说,它在逻辑上读作“env 变量的用户名属性”。知道 $env:username = ${env:username} = get-content env:username 很方便,因此感谢您的提醒。就我个人而言,我会说 $env:username 不应该被允许作为有效的语法,以免它与变量名混淆。不过感谢您的澄清。 :-)

标签: powershell


【解决方案1】:

Get-Help 'about_Providers' -ShowWindow 表明env:Environment Provider 中的驱动器,即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 等相反的原因。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不错的答案。我有一些不清楚的地方。也就是说,如果我们想找到所有内置变量,我们可以使用Get-ChildItem -Path variable:。那么,为什么结果列表不包含 $env,
    【解决方案3】:

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

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

    所以看起来像是批量驱动的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 2021-02-27
      • 2011-07-11
      • 1970-01-01
      • 2018-06-05
      • 2018-11-04
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多