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

ohtdti5x  于 2022-11-10  发布在  Shell
关注(0)|答案(9)|浏览(213)

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

gci env:*
ls Env:

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

to94eoyn

to94eoyn1#

较短版本:

gci env:* | sort-object name

这将同时显示名称和值。

yfwxisqw

yfwxisqw2#

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

gci env:
uttx8gqw

uttx8gqw3#

我最终笨手笨脚地找到了一个解决方案,迭代了词典中的每个条目:

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

dgiusagp4#

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

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

elcex8rz5#

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

gci env:* | select Name,Value

简称:

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

jogvjijk6#

此命令也适用:

dir env:
g0czyy6m

g0czyy6m7#

tl;dr

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

gci env: | oss

ossOut-String -Stream的内置 Package 函数,因此将每个名称-值对作为其自己的字符串返回;通过管道连接到Out-String(没有-Stream)以获得一个单行、多行字符串(尽管它总是意外地有一个尾随换行符-请参见GitHub issue #14444)。
要在PowerShell中列出所有环境变量的名称和值**,按名称排序,[1]使用Get-ChildItem cmdlet(其内置别名为gci)列出env:PowerShell drive的内容(子项):


# '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的for-display formatting system会自动将它们呈现为友好的两列格式。

  • 仅列出环境变量名称
gci env: -Name

# Alternative, using property access:

(gci env:).Name

# Output the value of environment variable "USERNAME"

$env:USERNAME

# Alternative, using property access:

(gci env:USERNAME).Value

如果您使用(可能隐含的).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'

注意:如果在不使用-Stream的情况下使用Out-String,您将得到一个单行、多行字符串作为输出,但请注意它将有一个尾随换行符。[2]
[1]请注意,将Get-ChildItem/gcienv:*一起使用,即在驱动器规范env:之后使用通配符*-不仅对于获取all变量是不必要的,而且实际上会导致未排序输出。
[2]就像在GitHub issue #14444中讨论的那样,总是附加一个尾随的换行符是有问题的

aemubtdh

aemubtdh8#

有几种方法可以获取PowerShell中的所有环境变量

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

按名称获取环境变量

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

zbdgwd5y9#

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

相关问题