powershell - PowerShell - 如何使用通配符获取环境变量值
问题描述
我有一些变量需要从中获取值,问题是在名称中间我可以有任何可能的值,因为它是工件名称。
示例:我有这些环境变量:
RELEASE_ARTIFACTS__TESTECOMPLETEPR__PROJECTNAME
RELEASE_ARTIFACTS__TESTECOMPLETEPR_REPOSITORY_NAME
我需要类似的东西:
$repoId = (Get-Item -Path Env:RELEASE_ARTIFACTS_*_REPOSITORY_ID).Value
或
$repoId = $Env:RELEASE_ARTIFACTS_*_REPOSITORY_ID
但这*
似乎不起作用。我怎样才能做到这一点?
解决方案
在cmdlet的参数中,所有提供程序都支持通配符表达式,也支持通配符表达式,这里更可取,因为它直接返回环境变量值(不需要);展示:-Path
Get-Item
Get-Content
(...).Value
$env:RELEASE_ARTIFACTS_FOO_REPOSITORY_ID = 1
Get-Content env:RELEASE_ARTIFACTS_*_REPOSITORY_ID # -> 1
也许令人惊讶的是,当您使用命名空间变量表示法时,它们也受支持,尽管您必须将引用括在其中{...}
(因为*
否则 a 将不会被识别为变量名的一部分):
${env:RELEASE_ARTIFACTS_*_REPOSITORY_ID} # -> 1
警告:向丹尼尔致敬。
如果通配符模式匹配多个项目(本例中为环境变量),则会发生语句终止错误。使用
Get-Content
(orGet-Item
) 方法检索多个值(项目)。- 鉴于这种尴尬,以及下面讨论的逃避陷阱,不支持命名空间变量表示法中的通配符匹配是有意义的,正如GitHub 问题 #9225中所建议的那样;虽然从技术上讲是一个突破性的变化,但我的感觉是不会对现实世界的代码产生太大影响。
奇怪的是,带有通配符模式的命名空间变量表示法不适用于变量(但是,这种表示法很少用于开头,因为它没有提供任何优势):
$variable:foo
$foo
不执行通配符匹配并且表现得像一个未定义的变量(${variable:HOM*}
$null
默认情况下它悄悄地计算)。- 虽然
Get-Content
/Get-Item
方法确实有效,但请注意,还有一个专用的Get-Variable
cmdlet(用于仅获-ValueOnly
取值) - 例如- 它还支持通过参数Get-Variable HOM* -ValueOnly
访问不同范围-Scope
内的变量。
- 虽然
命名空间变量表示法与Get-Content
:
命名空间变量表示法更简洁,性能更好(因为不涉及 cmdlet 调用)。
但是,
Get-Content
有时需要这种方法,即当您使用变量来指定环境变量名称或名称模式时;也就是说,假设变量定义$envVarName = 'RELEASE_ARTIFACTS_*_REPOSITORY_ID'
:不工作,${env:$envVarName}
- 但
Get-Content env:$envVarName
确实如此。
摆脱陷阱:
由于此答案中讨论的错误,转义通配符元字符(例如
[
您希望逐字解释)目前具有挑战性。如果应该逐字使用整个
Get-Content
名称,则可以通过使用'-LiteralPath
参数来避免转义;但是,这不是命名空间变量表示法的选项,其中名称总是被视为通配符模式。
推荐阅读
- scala - 使用 spark 将文件加载到 couchbase
- web-scraping - 为什么我在网页抓取时得到一个空列表而不是包含元素的列表
- css - 隐藏单个字段标签
- javascript - 光从值 0 变为 255,然后再次变为 0
- javascript - setTimeout 必须是 broswer 提供的 API 吗?
- php - PHP 表单邮件不会返回带有@yahoo.com 地址的条目
- nlp - 斯坦福 NLP 如何识别“它”是指谁?
- python - 如何将模型实例连接到 django 中的用户?
- iis - 无法访问 IIS 元数据库。您没有足够的权限访问您计算机上的 IIS 网站
- python - 调试python - 错误:没有指定主类?