首页 > 解决方案 > 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

但这*似乎不起作用。我怎样才能做到这一点?

标签: powershellazure-devopsazure-pipelineswildcard

解决方案


在cmdlet的参数中,所有提供程序支持通配符表达式,也支持通配符表达式,这里更可取,因为它直接返回环境变量值(不需要);展示:-PathGet-ItemGet-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(or Get-Item) 方法检索多个值(项目)。

    • 鉴于这种尴尬,以及下面讨论的逃避陷阱,支持命名空间变量表示法中的通配符匹配是有意义的,正如GitHub 问题 #9225中所建议的那样;虽然从技术上讲是一个突破性的变化,但我的感觉是不会对现实世界的代码产生太大影响。
  • 奇怪的是,带有通配符模式的命名空间变量表示法不适用于变量(但是,这种表示法很少用于开头,因为它没有提供任何优势):$variable:foo$foo${variable:HOM*}执行通配符匹配并且表现得像一个未定义的变量($null默认情况下它悄悄地计算)。

    • 虽然Get-Content/Get-Item方法确实有效,但请注意,还有一个专用的Get-Variablecmdlet(用于仅获-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参数来避免转义;但是,这不是命名空间变量表示法的选项,其中名称总是被视为通配符模式。


推荐阅读