显示正在运行的 PowerShell 脚本中的所有环境变量

我需要在运行时在 PowerShell 脚本中显示所有已配置的环境变量。通常,在显示环境变量时,我只需在 shell 中使用下列技术之一(还有其他技术,但这些技术都很简单) :

gci env:*
ls Env:

但是,我有一个从另一个程序调用的脚本,当我在脚本中使用上述调用之一时,我不会看到环境变量及其值,而是看到一个 System.Collections.DictionaryEntry类型的列表,而不是变量及其值。在 PowerShell 脚本中,如何显示所有环境变量?

150330 次浏览

最后,我通过迭代字典中的每个条目,笨拙地找到了一个解决方案:

(gci env:*).GetEnumerator() | Sort-Object Name | Out-String

简短版:

gci env:* | sort-object name

这将同时显示名称和值。

最短版本(变量按名称排序) :

gci env:

简短的版本与一个通配符 过滤器:

gci env: | where name -like 'Pro*'

我不认为所提供的任何答案与这个问题有关。 OP 获取的是对象类型列表(对于每个成员都是相同的) ,而不是实际的变量名和值。 这就是你想要的:

gci env:* | select Name,Value

简称:

Get-ChildItem Env:* | Select-Object -Property Name,Value

这个命令也可以起作用:

dir env:

如果使用 PowerShell Core (6或更高版本)(pwsh: https://github.com/PowerShell/PowerShell) ,也可以使用 ls env:

博士

因为您正在寻找环境变量名称-值对的 友好字符串表示法:

gci env: | oss

ossOut-String -Stream的内置包装函式,因此返回每个名称-值对作为它自己的字符串,通过管道到 Out-String(不包括 -Stream)获得一个 单线,多线字符串(尽管这个字符串总是出人意料地拥有一个 拖尾换行-参见 GitHub 第14444期)。


对于 PowerShell 中的 列出所有环境变量的 < em > 名称和值 按名字排序[1]使用 Get-ChildItem cmdlet (一个内置的别名是 gci)列出 env: PowerShell 硬盘的内容(子项) :

# 'gci' is a built-in alias of the 'Get-ChildItem' cmdlet.
# Avoid alias 'ls', because on Unix-like platforms
# it isn't defined and instead refers to the standard utility of that name.
# The output is implicitly *sorted by variable name*.
gci env:


# Use *wildcards* to list variables by *name pattern*; e.g, all whose
# name starts with "home"
gci env:home*

上述输出 物品 ,即具有 .Key(.Name)和 .Value属性的 [System.Collections.DictionaryEntry] 将每个变量描述为一个 < em > 名称-值对 实例。PowerShell 的 用于显示的格式化系统自动以友好的两列格式呈现这些内容。

  • 要 < strong > 只列出环境变量 名字:

    gci env: -Name
    
    
    # Alternative, using property access:
    (gci env:).Name
    
  • 对于 获取特定环境变量的值,例如 USERNAME,使用 命名空间变量符号是最简单的:

    # Output the value of environment variable "USERNAME"
    $env:USERNAME
    
    
    # Alternative, using property access:
    (gci env:USERNAME).Value
    

如果你使用 .ToString() (可能暗示) 串起来这些对象:

  • Windows PowerShell中,它们无用地串成它们的 类型名称,也就是逐字地串成 'System.Collections.DictionaryEntry'

  • PowerShell (核心)7中,它们现在更有意义地被字符串化为 '[<name>, <value>]'

  • 尝试使用(%ForEach-Objectcmdlet 的内置别名) :

    gci env: | % tostring
    
    
    # Ditto with Write-Host, which also uses .ToString() stringification
    gci env: | Write-Host
    

如果您希望将它们字符串化为 因为他们会打印到显示器上,使用友好的双列格式 ,请使用 Out-String cmdlet:

# Outputs *friendly* string representations
gci env: | oss # 'oss' is a built-in wrapper function for 'Out-String -Stream'

注意: 如果使用 Out-String而不使用 -Stream,则会得到一个 单线,多线字符串作为输出,不过请注意,它将有一个 拖尾换行.[2]


请注意,使用 Get-ChildItem/gcienv:*,即按照驱动器规范 env:的通配符 *,不仅不需要获得 所有变量,而且实际上会产生 没有分类输出。

[2]如 GitHub 第14444期中所讨论的,尾随换行总是被附加是有问题的

在 Powershell 有几种获取所有环境变量的方法

 [System.Environment]::GetEnvironmentVariables()
or
dir env:

环境变量的名字

[System.Environment]::GetEnvironmentVariable("USERNAME")
$env:USERNAME