PowerShell - 如何使用通配符获取环境变量值

PowerShell - How to get Environment Variable value using wildcards

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

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

但是*好像不行。 我该怎么做?

Wildcard expressions are supported, with all providers, in the -Path parameter of the Get-Item cmdlet, and also with Get-Content,这里更可取,因为它returns直接环境变量值(不需要(...).Value);演示:

$env:RELEASE_ARTIFACTS_FOO_REPOSITORY_ID = 1

Get-Content env:RELEASE_ARTIFACTS_*_REPOSITORY_ID # -> 1

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

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

注意事项:小提示Daniel

  • 如果通配符模式匹配多个(本例中为环境变量),出现语句终止 错误。使用 Get-Content(或 Get-Item)方法检索多个值(项)。

    • 鉴于这种尴尬,以及下面讨论的转义陷阱,支持命名空间变量表示法中的通配符匹配是有意义的 ,如 GitHub issue #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 确实如此。
  • 逃避陷阱:

    • 转义通配符元字符,例如 [ 您希望被解释 逐字 目前具有挑战性,因为 [=43] 中讨论的错误=].

    • 如果要逐字使用整个名称,可以使用Get-Content-LiteralPath避免转义参数代替;但是,这不是带有命名空间变量符号的选项,其中名称 总是 被视为通配符模式。