我需要在运行时显示 PowerShell 脚本中所有配置的环境变量。通常,当显示环境变量时,我可以在 shell 中使用以下其中一项(以及其他技术,但这些都很简单):
gci env:*
ls Env:
但是,我有一个从另一个程序调用的脚本,当我在脚本中使用上述调用之一时,我没有看到环境变量及其值,而是得到了
System.Collections.DictionaryEntry
类型的列表,而不是变量及其值。在 PowerShell 脚本内部,如何显示所有环境变量?
较短版本:
gci env:* | sort-object name
这将显示名称和值。
最短版本(变量按名称排序):
gci env:
我最终通过迭代字典中的每个条目摸索出了解决方案:
(gci env:*).GetEnumerator() | Sort-Object Name | Out-String
带有通配符的简短版本过滤器:
gci env: | where name -like 'Pro*'
我认为所提供的任何答案都与问题无关。 OP 正在获取对象类型列表(每个成员都相同),而不是实际的变量名称和值。 这就是您所追求的:
gci env:* | select Name,Value
简称:
Get-ChildItem Env:* | Select-Object -Property Name,Value
此命令也有效:
dir env:
长环境变量值默认会被截断。
这是获取具有完整值的环境变量排序列表的一种快速方法:
Get-ChildItem env:* | Sort-Object Name | Format-List
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*
[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
中所述Powershell中有多种方式获取所有环境变量
[System.Environment]::GetEnvironmentVariables()
or
dir env:
通过名称获取环境变量
[System.Environment]::GetEnvironmentVariable("USERNAME")
$env:USERNAME
如果您使用的是PowerShell Core(6或以上)(pwsh:https://github.com/PowerShell/PowerShell),您也可以使用
ls env: