【问题标题】:PowerShell - How to get Environment Variable value using wildcardsPowerShell - 如何使用通配符获取环境变量值
【发布时间】:2021-10-11 11:17:03
【问题描述】:

我有一些变量需要从中获取值,问题是在名称中间我可以有任何可能的值,因为它是工件名称。

示例: 我有这些环境变量: 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

但* 似乎不起作用。 我该怎么做?

【问题讨论】:

    标签: powershell azure-devops azure-pipelines wildcard


    【解决方案1】:
    在Get-Item cmdlet 的-Path 参数中支持

    Wildcard expressions 支持所有 提供程序,还支持Get-Content,这是更可取的这里是因为它直接返回环境变量值(不需要(...).Value);演示:

    $env:RELEASE_ARTIFACTS_FOO_REPOSITORY_ID = 1
    
    Get-Content env:RELEASE_ARTIFACTS_*_REPOSITORY_ID # -> 1
    

    也许令人惊讶的是,当您使用 namespace variable notation 时,它们也受支持,但您必须将引用包含在 {...} 中(因为 * 否则不会被识别为变量名的一部分):

    ${env:RELEASE_ARTIFACTS_*_REPOSITORY_ID} # -> 1
    

    注意事项:向Daniel致敬。

    • 如果通配符模式匹配多个项(在这种情况下为环境变量),会发生语句终止错误强>。使用Get-Content(或Get-Item)方法检索多个值(项)。

      • 鉴于这种尴尬,以及下面讨论的逃避陷阱,按照GitHub issue #9225 中的建议,不支持命名空间变量表示法中的通配符匹配是有意义的;虽然从技术上讲是一个重大变化,但我的感觉是不会对实际代码产生太大影响。
    • 奇怪的是,名称空间变量表示法带有通配符模式 不 与变量 一起工作(但是,这种表示法很少用于开头,但是,鉴于$variable:foo 与$foo 相比没有优势):${variable:HOM*} 执行 no 通配符匹配并且表现得像一个未定义的变量(它悄悄地计算为 $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 可以。
    • 逃避陷阱:

      • 由于this answer 中讨论的错误,目前逐字 转义您想要解释的通配符元字符,例如[。

      • 如果应该逐字使用整个名称,则可以通过使用Get-Content的-LiteralPath参数来避免转义;但是,这不是命名空间变量表示法的选项,其中名称​​总是被视为通配符模式。

    【讨论】:

    • 谢谢你,@Daniel - 好点。我已将信息添加到答案中,并附有一些额外的评论。 ${variable:PSVer*Table} 不工作至少是一个奇怪的不一致,尽管从总体上看,我认为从不支持命名空间变量中的通配符匹配会更明智;也就是说,${env:someName} 应该始终等同于 Get-Content -LiteralPath env:someName,而不是 Get-Content -Path env:someName` - 这也解决了 multiple 匹配时发生的错误的尴尬 - 请参阅链接的 GitHub 问题。
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多