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

问题描述 投票:0回答:10

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

gci env:*
ls Env:

但是,我有一个从另一个程序调用的脚本,当我在脚本中使用上述调用之一时,我没有看到环境变量及其值,而是得到了

System.Collections.DictionaryEntry
类型的列表,而不是变量及其值。在 PowerShell 脚本内部,如何显示所有环境变量?

powershell environment-variables
10个回答
290
投票

较短版本:

gci env:* | sort-object name

这将显示名称和值。


92
投票

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

gci env:

20
投票

我最终通过迭代字典中的每个条目摸索出了解决方案:

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

16
投票

带有通配符的简短版本过滤器

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

15
投票

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

gci env:* | select Name,Value

简称:

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

12
投票

此命令也有效:

dir env:

7
投票

长环境变量值默认会被截断。

这是获取具有完整值的环境变量排序列表的一种快速方法:

Get-ChildItem env:* | Sort-Object Name | Format-List

6
投票

tl;博士

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

gci env: | oss

oss
Out-String -Stream
的内置包装函数,因此将每个名称-值对作为其自己的字符串返回;通过管道连接到
Out-String
(不带
-Stream
)以获取单多行字符串(尽管该字符串总是意外地带有 尾随换行符 - 请参阅 GitHub 问题 #14444)。


要在 PowerShell 中列出所有环境变量名称和值按名称排序[1]使用

env: 列出 Get-ChildItem PowerShell 驱动器
的内容(子项) 
cmdlet(其内置别名为
gci
):

# '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*

上面输出 objects,即

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

  • 列出环境变量名称

    gci env: -Name
    
    # Alternative, using property access:
    (gci env:).Name
    
  • 获取特定环境变量的,例如

    USERNAME
    的值,最简单的是使用命名空间变量表示法:

    # Output the value of environment variable "USERNAME"
    $env:USERNAME
    
    # Alternative, using gc (alias of Get-Content)
    # Needed if the name is stored in a variable.
    gc env:USERNAME
    

如果您stringify这些对象(可能暗示)

.ToString()

  • Windows PowerShell 中,它们无用地字符串化为其 类型名称,即逐字

    'System.Collections.DictionaryEntry'

  • PowerShell (Core) 7 中,它们现在更有意义地字符串化为

    '[<name>, <value>]'

  • 尝试使用(

    %
    ForEach-Object
    cmdlet的内置别名):

    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]


[1] 请注意,使用

Get-ChildItem
/
gci
env:*
,即驱动器规范
*
后面的通配符
env:
- 不仅不需要获取 all 变量,它实际上会导致 未排序输出。

[2] 总是附加尾随换行符是有问题的,如 GitHub 问题 #14444

中所述

5
投票

Powershell中有多种方式获取所有环境变量

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

通过名称获取环境变量

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

0
投票

如果您使用的是PowerShell Core(6或以上)(pwsh:https://github.com/PowerShell/PowerShell),您也可以使用

ls env:

© www.soinside.com 2019 - 2024. All rights reserved.