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
避免转义参数代替;但是,这不是带有命名空间变量符号的选项,其中名称 总是 被视为通配符模式。
我有一些变量需要从中获取值,问题是在名称中间我可以有任何可能的值,因为它是工件名称。
示例:
我有这些环境变量:
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
避免转义参数代替;但是,这不是带有命名空间变量符号的选项,其中名称 总是 被视为通配符模式。